Perl POSIX回归错误的一年

时间:2014-12-08 09:26:46

标签: perl posix

我有代码:

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年的前几天。是否有我应该做些什么不同的事情?

2 个答案:

答案 0 :(得分:10)

%GISO_8601标准

的约束

来自perldoc

  

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

man strftime

  

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

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

答案 1 :(得分:8)

你想要%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