2014-12-08 38 views
2

我的代碼: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年。有什麼我應該做的不同?

回答

10

%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 
+1

愚蠢的ISO 8601。謝謝!將它更改爲%Y固定它! – 2014-12-08 09:41:30

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