使用 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 扩展名相同但轻得多,strptime
是
from 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。
是否可以使用 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 扩展名相同但轻得多,strptime
是
from 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。