【问题标题】:How to get user's computer local timezone with offset in Perl?如何在 Perl 中使用偏移量获取用户计算机的本地时区?
【发布时间】:2016-08-10 10:19:16
【问题描述】:

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

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

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

==Time zone offsets===+0530

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

==Time zone offsets===-0400

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

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

【问题讨论】:

  • 您的实时服务器在哪里,您在哪里?听起来您的一个或另一个系统配置错误,但 9.5 小时的差异是巨大的!除非系统操作员告诉它们,否则大多数 PC 无法知道它们在哪里!
  • 目前我在印度,但服务器在美国
  • 所以数字是正确的。您必须将本地时区传递给服务器以进行必要的调整。
  • 谢谢!您能帮我正确使用脚本将本地时区传递给服务器吗?
  • 用户如何连接到服务器?

标签: perl timezone offset


【解决方案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 环境变量。

$ 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 2012-09-06
    • 2011-03-11
    • 2012-08-14
    • 2010-10-22
    • 2015-11-10
    • 2011-02-15
    相关资源
    最近更新 更多