使用 POSIX 将时间戳转换为 GMT

Converting timestamp to GMT with POSIX

是否可以使用 POSIX 模块在 Perl 中将给定时间戳转换为 GMT?以下是我尝试过的方法,但不确定为什么时间这么晚...

use POSIX;
my $shipts = "2017-09-23 20:53:00";
my $shiptsgmt = strftime("%Y-%m-%d %R", localtime(str2time($shipts, 'GMT')));
print "$shiptsgmt\n";

服务器本地时间是太平洋时间,你猜我想做的是不正确的。以上产生 2017-09-23 13:53 而我需要 2017-09-24 03:53 时间。

仅凭 POSIX 无法做到这一点,这离不开内置函数和一些处理的帮助。

替代方案:Time::Piece 是核心,根据我的经验,它比 POSIX

快得多
perl -MTime::Piece -wE'
    $d = "2017-09-23 20:53:00"; 
    $t = localtime->strptime($d, "%Y-%m-%d %H:%M:%S");
    $t = gmtime($t->epoch);
    say $t->strftime("%Y-%m-%d %H:%M:%S");
'

这将创建一个对象,然后使用 gmtime 的模块(兼容)替换将其转换为 GMT,返回一个也适当标记为 GMT 的对象。

strftime 与 POSIX 扩展名相同但轻得多,strptimefrom FreeBSD。 该模块还有许多方法可以将 datetime 对象的各个部分或表示形式作为字符串,以及一些其他实用程序。另见 Time::Seconds.

用于解析和字符串化的DateTime does all this nicely, via its formatters。但是很重


注意 很容易错误地使用这个模块,而这个答案在 ikegami 修复它之前就做到了。所以请非常小心除基本以外的任何用途。查看链接的答案


  • 完整说明转换时区时可能出现的与 DST 相关的错误。

  • (answer): How can I parse dates and convert time zones in Perl?
    事实证明,这实际上涵盖了这个问题。

请注意,上面的答案在 v5.10 中不起作用,显然是由于模块中的 then-bug。