【问题标题】:Perl POSIX returning wrong yearPerl POSIX 返回错误的年份
【发布时间】:2014-12-09 02:40:04
【问题描述】:

我有代码:

use POSIX qw( strftime );
print POSIX::strftime("%a, %d %b %G %T-0000",localtime(1325427034));

应该输出哪个

Sun, 01 Jan 2012 09:10:34-0000

而是输出

Sun, 01 Jan 2011 09:10:34-0000

在我做的一些测试中,它似乎发生在 2010 年、2011 年或 2012 年的前几天。它在包括 2013 年和 2014 年的前几天在内的所有其他情况下都能正常工作。有没有我应该做些不同的事情吗?

【问题讨论】:

    标签: perl posix


    【解决方案1】:

    %GISO_8601标准约束,

    来自perldoc

    有关这些和其他参数的详细信息,请参阅系统的 strftime() 手册页。

    man strftime

    %G 基于 ISO 8601 周的年份(参见注释),世纪为十进制数。对应于 ISO 周数的 4 位数年份(请参阅 %V)。这有 与 %Y 相同的格式和值,除了如果 ISO 周数属于上一年或下一年,则使用该年份。 (TZ)

    print POSIX::strftime("%a, %d %b %Y %T-0000",localtime(1325427034));
                                      ^__ gives 2012 
    

    【讨论】:

    • 愚蠢的 ISO 8601。谢谢!将其更改为 %Y 已修复!
    【解决方案2】:

    你想要 %Y,而不是 %G。 %G 旨在与 %V 一起使用以显示 ISO 8601 周数,该周数可能在年初之前开始或结束后结束。

    例子:

    use POSIX 'strftime';
    print strftime("%Y-%m-%d week %G-%V\n",0,0,0,$_,11,111) for 25..31;
    print strftime("%Y-%m-%d week %G-%V\n",0,0,0,$_,0,112) for 1..9;
    

    输出:

    2011-12-25 week 2011-51
    2011-12-26 week 2011-52
    2011-12-27 week 2011-52
    2011-12-28 week 2011-52
    2011-12-29 week 2011-52
    2011-12-30 week 2011-52
    2011-12-31 week 2011-52
    2012-01-01 week 2011-52
    2012-01-02 week 2012-01
    2012-01-03 week 2012-01
    2012-01-04 week 2012-01
    2012-01-05 week 2012-01
    2012-01-06 week 2012-01
    2012-01-07 week 2012-01
    2012-01-08 week 2012-01
    2012-01-09 week 2012-02
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多