如何在Perl中获得给定时区的秒数- UTC时间



我有一个格式为: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字符串)。

相关内容

  • 没有找到相关文章

最新更新