Bry*_*eld 7 c perl timezone posix localtime
我最近学会了如何更改localtimePerl 返回的时区.
use POSIX qw(tzset);
print localtime . "\n";
$ENV{TZ} = 'America/Los_Angeles';
print localtime . "\n";
tzset;
print localtime . "\n";
Run Code Online (Sandbox Code Playgroud)
输出
Wed Apr 15 15:58:10 2009
Wed Apr 15 15:58:10 2009
Wed Apr 15 12:58:10 2009
Run Code Online (Sandbox Code Playgroud)
请注意小时仅在调用后如何更改tzset.
This is perl, v5.8.8 built for x86_64-linux-thread-multi
Run Code Online (Sandbox Code Playgroud)
但是,在我的系统上,我得到了,
Fri Jul 8 19:00:51 2016
Fri Jul 8 16:00:51 2016
Fri Jul 8 16:00:51 2016
Run Code Online (Sandbox Code Playgroud)
请注意我的系统如何在不调用的情况下更改小时tzset.这适用于Ubuntu和Illumos中的Perl的最新版本,以及v5.8.8Solaris 10上的Perl .
因此,如果我的所有测试都表明tzset没有效果,那么为什么/其他系统需要tzset明确调用?我是否仍需要打电话tzset以保持与某些环境兼容,或者它现在已成为过去?
TL;DR:从Perl v5.8.9(2011 年发布)开始,不再需要tzset更改时进行调用。$ENV{TZ}
Perl 的内部localtime调用,不需要调用。Linux 联机帮助页建议:localtime_r(3) tzset(3)
根据 POSIX.1-2004,localtime() 的行为需要像调用 tzset(3) 一样,而 localtime_r() 没有此要求。对于可移植代码,应在 localtime_r() 之前调用 tzset(3)。
在较旧的非多线程 Perls 中,或者如果localtime_r(3)在构建期间不可用,localtime(3)则使用它。在这种情况下,根据 POSIX调用tzset就没有必要了:
使用本地时区信息就像 localtime() 调用 tzset()
尽管有时glibc 似乎不遵守这一点:
至于任何不总是调用 tzset 的代码:这肯定不会改变。太贵了。为了什么?0.000001% 的人带着笔记本电脑去环游世界,并期望收到例如带有根据本地时区的日期的系统日志消息。这还不够合理。只需重新启动您的机器即可。
不过,这确实发生了变化,并且 glibc 现在确实像 tztime(3)被调用一样,但仅适用于不可重入localtime,这可能不是您的 Perl 编译使用的。
有两个与此相关的 Perl 错误报告:#26136和#41591。
作为修复,Perl 现在在配置时决定tzset(3)是否需要执行隐式操作,这使得在用户代码中指定它变得多余。