我有代码:
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年的前几天。是否有我应该做些什么不同的事情?
答案 0 :(得分:10)
%G
受ISO_8601
标准
来自perldoc
有关这些和其他参数的详细信息,请参阅系统的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