如何在Perl中获取具有偏移量的用户计算机本地时区?

时间:2016-08-10 10:19:16

标签: perl timezone offset

我正在尝试使用以下代码在Perl中获取用户的计算机本地时区:

use POSIX;
my $timezone = strftime("%z", localtime());
print "\n==Time zone offsets===".$timezone."\n";

在本地计算机上运行脚本时,上面的脚本打印输出如下:

==Time zone offsets===+0530

当从实时服务器运行相同的脚本但在同一台计算机上运行时,它会显示不同的输出,如下所示:

==Time zone offsets===-0400

我希望脚本应该始终返回用户本地计算机而不是服务器的时区偏移量。

请帮助我尝试,但没有得到它。

1 个答案:

答案 0 :(得分:1)

您需要提供用户的时区。使用DateTime

完成以下操作
$ for tz in local Asia/Calcutta; do
     perl -e'
        use feature qw( say );
        use DateTime qw( );
        say DateTime->now( time_zone => $ARGV[0] );
     ' "$tz"
  done
2016-08-10T13:20:06
2016-08-10T22:50:06

您也可以适当地设置TZ env var。

$ export TZ
$ for TZ in America/Toronto Asia/Calcutta; do
     perl -e'
        use feature qw( say );
        use DateTime qw( );
        say DateTime->now( time_zone => "local" );
     '
  done
2016-08-10T13:20:06
2016-08-10T22:50:06

TZ也会影响localtime

$ export TZ
$ for TZ in America/Toronto Asia/Calcutta; do
     perl -e'
        use feature qw( say );
        use POSIX qw( strftime );
        say strftime("%Y-%m-%dT%H:%M:%S", localtime);
     '
  done
2016-08-10T13:20:06
2016-08-10T22:50:06

如果您在脚本中更改了$ENV{TZ},则需要在之后致电POSIX::tzset();

$ perl -e'
     use feature qw( say );
     use POSIX qw( strftime tzset );
     for my $tz (qw( America/Toronto Asia/Calcutta )) {
        $ENV{TZ} = $tz;
        tzset();
        say strftime("%Y-%m-%dT%H:%M:%S", localtime);
     }
  '
2016-08-10T13:20:06
2016-08-10T22:50:06