【问题标题】:When does a Perl script need to call `tzset` before calling `localtime`?Perl 脚本何时需要在调用 `localtime` 之前调用 `tzset`?
【发布时间】:2016-11-11 14:44:00
【问题描述】:

我最近学习了how to change the timezone returned by localtime in Perl

use POSIX qw(tzset);
print localtime . "\n";
$ENV{TZ} = 'America/Los_Angeles';
print localtime . "\n";
tzset;
print localtime . "\n";

输出

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 以保持与某些环境的兼容性,还是现在已成为过去?

【问题讨论】:

  • perldoc.perl.org/perlport.html#Time-and-Date tl;dr - 系统的时间和日历日期的概念以不同的方式进行控制。不要假设时区存储在 $ENV{TZ} 中,即使是,也不要假设您可以通过该变量控制时区。
  • 我想要一些具体的东西。我的测试表明不拨打tzset 是安全的。由于此处的软件仅适用于特定平台,因此我不想告诉我们的团队做不必要的额外工作。那么,在什么情况下我们需要tzset
  • 发布并删除了一个答案,但链接到pubs.opengroup.org/onlinepubs/9699919799/functions/…,上面写着“使用本地时区信息,就好像localtime()调用tzset()一样。”,所以如果系统符合 POSIX 标准,听起来localtime 应该自动调用tzset ???这是决定性因素 - 操作系统是否符合 POSIX?

标签: c perl timezone posix localtime


【解决方案1】:

TL;DR:从 Perl v5.8.9(2011 年发布)开始,在不再需要更改 $ENV{TZ} 时调用 tzset


Perl 的 localtime 调用 localtime_r(3) internally,这不是调用 tzset(3) 所必需的。 Linux manpage 建议:

根据 POSIX.1-2004,localtime() 必须表现得像 tzset(3) 被调用,而 localtime_r() 没有这个 要求。对于可移植代码 tzset(3) 应该在之前调用 localtime_r()。

在较旧的非多线程 Perls 中,或者如果在构建期间 localtime_r(3) 不可用,则使用 localtime(3) 代替。在这种情况下,就不需要调用tzsetper POSIX

使用本地时区信息,就像 localtime() 调用 tzset()

虽然似乎有过glibc didn't adhere to that:

至于任何不一直调用 tzset 的代码:这绝对是 不会改变。它太贵了。为了什么? 0.000001% 带着笔记本电脑参加世界巡回演唱会并期待的人,例如, 带有根据本地时区日期的系统日志消息。这是 没有足够的理由。只需重新启动您的机器。

这个确实改变了,现在 glibc 的行为就像调用了 tztime(3),但仅适用于不可重入的 localtime,这可能不是您的 Perl 编译使用的。

有两个关于此的 Perl 错误报告:#26136#41591

作为修复,Perl 现在 decides at configuration time 是否需要执行隐式 tzset(3),这使得在用户代码中指定它是多余的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2011-11-24
    相关资源
    最近更新 更多