8

我有一个简单的 gnuplot 命令文件:

 ....
set xdata time
set timefmt "%s"
set format x "%H:%M"
....

其中 x - 时间戳列。

结果 - UTC 格式的时间。我可以更改 x 轴的本地时区吗?

4

5 回答 5

7

今天刚刚在文档中遇到了这个:

与秒之间的转换采用世界时间(与格林威治标准时间相同)。没有更改时区或夏令时的规定。如果您的所有数据都指的是同一时区(并且都是日光或标准),则您无需担心这些事情。但如果绝对时间对您的应用程序至关重要,则您需要自己转换为 UT。

help time/date

于 2013-01-25T02:59:39.860 回答
6

我今天刚碰到这个。您无需更改格式,只需更改数据即可。如果 data.txt 包含 UTC 时间戳,并且您想在 PDT 中显示它们(距 UTC 有 -7 小时),只需使用:

plot 'data.txt' using ($1+(-7*3600)):2

这会从每个 x 值中减去 7 小时(以秒为单位)。

于 2016-06-15T03:19:02.750 回答
1

聚会有点晚了,我没有足够的声誉点来发表评论,但为了补充 anthony 和 hermannk 的回答,我是这样用他们的信息实现的:

  • 在 中command.gnuplot,假设第一个字段包含日期/时间,第二个字段包含 Y 轴的值:

plot "inputfile" using ($1 - offset):2

  • 从(bash)命令行调用gnuplot时:

gnuplot -e "offset=$(date +%s -d '1 Jan 1970')" command.gnuplot

偏移量通常可以正常工作,因为 gnuplot 在内部将日期/时间解释为从纪元开始的秒数。我不知道表单"offset=$(date ...)"是否是特定于 bash 的东西,但你总是可以使用它"offset=`date ...`"

编辑——我发现这在处理夏令时/夏令时变化时效果不佳。我将偏移量更改为这个,现在效果更好:

  • 在 中command.gnuplot,假设第一个字段包含日期/时间,第二个字段包含 Y 轴的值:

plot "inputfile" using ($1 + offset):2

  • 从(bash)命令行调用gnuplot时:

gnuplot -e "offset=$(echo "日期 +%z* 36" | bc)" command.gnuplot

这是如何运作的? date +%z以形式或类似形式提供时区偏移量-0400,这意味着Local_Time = UTC - 4 hours. 如果我们认为这是一个数字(-400),那么偏移量(以秒为单位)为 -400 / 100 * 3600 = -400 * 36。请注意,这不适用于具有 30 分钟增量的时区(印度?),但我敢肯定,通过一些创建数学,您也可以涵盖这一点。

于 2020-06-12T18:46:40.827 回答
0

除了以前的正确答案之外,还有我如何在

的 4.1 版开始,您可以避免date为此使用分叉:

printf -v tzoff "%(%z)T" -1
tzoff=${tzoff:0:1}$(( ( 10#${tzoff:1:2}* 3600 + 10#${tzoff:3:2}* 60 ) ))

一些样本:

TZ=Asia/Katmandu printf -v tzoff "%(%z)T" -1
echo $tzoff 
+0545

tzoff=${tzoff:0:1}$(( ( 10#${tzoff:1:2}* 3600 + 10#${tzoff:3:2}* 60 ) ))
echo $tzoff 
+20700

TZ=America/Chihuahua printf -v tzoff "%(%z)T" -1
echo $tzoff 
-0700

tzoff=${tzoff:0:1}$(( ( 10#${tzoff:1:2}* 3600 + 10#${tzoff:3:2}* 60 ) ))
echo $tzoff 
-25200

然后$tzoff在创建.dat文件时或者将它们添加到绘图命令文件中,或者将其添加到值中。

printf -v plotcmd 'plot \47file.dat\47 using ($1%s):2' $tzoff

echo "$plotcmd"
plot 'file.dat' using ($1-25200):2
于 2020-11-02T14:59:02.167 回答
0

此处发布的片段对我不起作用,但这似乎可以解决问题:

TZ=Europe/Amsterdam tzoff=$(printf "%(%z)T")
tzoff=${tzoff:0:1}$(( ( 10#${tzoff:1:2} * 3600 + 10#${tzoff:3:2}* 60 ) ))
echo $tzoff
于 2020-12-18T12:33:04.670 回答