在调用`localtime`之前,Perl脚本何时需要调用`tzset`?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在调用`localtime`之前,Perl脚本何时需要调用`tzset`?相关的知识,希望对你有一定的参考价值。
我最近学会了how to change the timezone returned by localtime
in Perl。
use POSIX qw(tzset);
print localtime . "
";
$ENV{TZ} = 'America/Los_Angeles';
print localtime . "
";
tzset;
print localtime . "
";
输出
Wed Apr 15 15:58:10 2009
Wed Apr 15 15:58:10 2009
Wed Apr 15 12:58:10 2009
注意在调用tzset
之后小时只会改变。
This is perl, v5.8.8 built for x86_64-linux-thread-multi
但是,在我的系统上,我得到了,
Fri Jul 8 19:00:51 2016
Fri Jul 8 16:00:51 2016
Fri Jul 8 16:00:51 2016
注意如何在我的系统上,小时改变而不调用tzset
。这适用于Ubuntu和Illumos中的Perl的最新版本,以及Solaris 10上的Perl v5.8.8
。
因此,如果我的所有测试表明tzset
没有效果,为什么/其他系统需要明确调用tzset
?我是否仍需要调用tzset
以保持与某些环境兼容,或者它现在已成为过去?
TL; DR:从Perl v5.8.9(2011年发布)开始,不再需要更换tzset
时调用$ENV{TZ}
。
Perl的localtime
称localtime_r(3)
internally,不需要打电话给tzset(3)
。 Linux manpage建议:
根据POSIX.1-2004,localtime()需要表现得就像调用tzset(3)一样,而localtime_r()则没有这个要求。对于可移植代码,应在localtime_r()之前调用tzset(3)。
在较旧的非多线程Perls中,或者如果在构建期间没有localtime_r(3)
,则使用localtime(3)
。在这种情况下,tzset
的调用是不必要的,per POSIX:
使用本地时区信息,就像localtime()调用tzset()一样
虽然似乎有时候glibc didn't adhere to that:
至于任何一直没有调用tzset的代码:这绝对不会改变。这太贵了。为了什么? 0.000001%的人在世界巡演中使用笔记本电脑并期望例如根据本地时区的日期的系统日志消息。这不足以说明理由。只需重启你的机器。
这确实发生了变化,而glibc现在确实表现得好像tztime(3)
被调用,但仅适用于非重入的localtime
,这可能不是你的Perl编译使用的。
有两个关于此的Perl bug报告:#26136和#41591。
作为修复,Perl现在decides at configuration time是否需要执行隐式tzset(3)
,这使得在用户代码中指定它是多余的。
以上是关于在调用`localtime`之前,Perl脚本何时需要调用`tzset`?的主要内容,如果未能解决你的问题,请参考以下文章