我有一个格式为:1311597859.567497 y_value_to_plot
的文件。第一个令牌是自epoch以来的时间,即unix时间。用户希望使用该文件名和时区规范(如"America/New_York"或"Europe/London")调用plot_file.pl。用set xdata time; set timefmt "%s"
在这个文件上调用gnuplot可以工作,但是它显示的是UTC时间的小时。但是用户希望看到当地时间。因此,对于1311597859.567497
,没有任何时区更改,gnuplot将显示12:44:19
,但是如果用户指定America/New_York
,他希望在gnuplot窗口中看到08:44:19。我认为一个简单的修复方法是计算utc和给定时区之间的偏移量,并从令牌中减去它,然后在这个新文件上运行新的plot。因此,我正在寻找一种方法,从给定的时区在Perl中获得UTC的offset_seconds。
我假设您的unix时间是指从本地时间的epoch开始的秒数,并且您试图转换为从UTC的epoch开始的秒数。
考虑使用Time::Zone或DateTime::TimeZone (DateTime的一部分)这样的模块来帮助进行这样的计算。
例如Time::Zone:use Time::Zone;
my $offset_sec = tz_local_offset(); # or tz_offset($tz) if you have the TZ
# in a variable and it is not local
my $time = time(); # realistically it will be the time value you provide in localtime
my $utc_time = $time + $offset_sec;
With DateTime and DateTime::TimeZone:
use DateTime;
use DateTime::TimeZone;
# cache local timezone because determining it can be slow
# if your timezone is user specified get it another way
our $App::LocalTZ = DateTime::TimeZone->new( name => 'local' );
my $tz = DateTime::TimeZone->new( name => $App::LocalTZ );
my $dt = DateTime->now(); # again, time will be whatever you are passing in
# formulated as a DateTime
my $offset = $tz->offset_for_datetime($dt);
请注意,使用DateTime,您可以简单地通过set_time_zone('UTC')
将DateTime对象从本地时间转换为UTC时间,然后将其格式化为gnuplot。
要手工完成,如果您可以从本地时间获得epoch秒,则可以格式化gmtime的输出(可能使用mktime out of date/time字符串)。