我有一个包含以下形式的行的文件:1311597859.567497 y_value_to_plot
。第一个标记是自纪元以来的时间,即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和给定时区之间的偏移量,然后从令牌中减去它,然后在这个新文件上运行新的绘图。
因此,我一直在寻找一种方法来从Perl中的给定时区获得UTC的offset_seconds。
答案 0 :(得分:4)
通过unix时间我假设你的意思是自当地时间以来的秒数,并且你试图转换为自UTC时代以来的秒数。
考虑使用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;
使用DateTime和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。
要手动完成所有操作,您可以格式化gmtime的输出,如果您可以从当地时间到达纪元秒(可能使用日期/时间字符串中的mktime)。