是否可以使用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时间。
答案 0 :(得分:3)
只有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扩展名轻得多strptime
from FreeBSD。
该模块还有许多方法可以将日期时间对象的各个部分或表示形式作为字符串,以及一些其他实用程序。另请参阅Time::Seconds。
DateTime完成所有这一切,通过其formatters进行解析和字符串化。但它很重。
注意最终错误地使用此模块很容易,而且这个答案在ikegami修复它之前就做到了。所以请非常小心基本以外的任何用途。请参阅相关链接
(answer): How to make Time::Piece respect DST when converting localtime to UTC?
有关转换时区时可能存在与DST相关的错误的完整说明。
(answer): How can I parse dates and convert time zones in Perl?
事实证明,这实际上涵盖了这个问题。
请注意,上面的答案在v5.10 中不起作用,显然是由于模块中存在一个bug。