2016-03-10 151 views
0

DateTime#parse'Mon, 30 Dec 2013 00:00:00 UTC +00:00'错误的一周。我选择了ISO 8601以周为单位的年和周编号%V(以周为基础的年编号为01..53)。'2013年12月30日'的日期时间解析不正确

随着格式"%V-%y"

DateTime.parse('Mon, 30 Dec 2013 00:00:00 UTC +00:00').strftime "%V-%y" 
#⇒ "01-13" 

DateTime.parse('Mon, 30 Dec 2013 00:00:00 UTC +00:00').strftime "%W-%y" 
#⇒ "52-13" 

Date.strptime('01-13', '%V-%y') 
#⇒ Tue, 01 Jan 2013 

Date.strptime('52-13', '%V-%y') 
#⇒ Tue, 01 Jan 2013 

Mon, 30 Dec 2013 00:00:00 UTC +00:00"01-13"

但是,如果我使用"%W"格式,结果是正确的("52-13")。

这是什么?还是我犯了一些错误?

+0

我没有看到任何错误,除非你声称有什么不对。哪里不对? – sawa

+0

@sawa这是不公平的,这个问题已经清楚地说明了,'30-Dec-13'确实不属于_2013_的_first_ week(第一个LOC)。 – mudasobwa

+0

@mudasobwa这是对的。 '12月30日-30日“是ISO8601年第一季度的第一周,并且是2013年的常规年份,但不是2013年常规年份的第一周。但这与OP的声称无关解析是错误的。解析实际上没有错。但我想你明白发生了什么事。 – sawa

回答

1

使用基于周的周数(%V)应该使用基于星期年(%g):

DateTime.parse('Mon, 30 Dec 2013 00:00:00 UTC +00:00').strftime "%V-%g" 
#⇒ "01-14" 
0

cday,cweek和cyear是基于商用日期方法。

commercial:创建一个日期对象,表示给定的星期日期。

因此,一年中的最后几天可能是新年开始日的同一周。

例如2013年12月的最后日期和2014年1月的开始日期是同一周,所以日期的周数'周一,2013年12月30日00:00:00 UTC +00:00'进入新的一周在一年的所有星期完成后,明年的

所以,

"Mon, 30 Dec 2013 00:00:00 UTC +00:00".to_date.cweek ==> 1 
"Mon, 30 Dec 2013 00:00:00 UTC +00:00".to_date.cwday ==>1 (1st week day of week 1 2014(but date is still of 2013) 
"Mon, 30 Dec 2013 00:00:00 UTC +00:00".to_date.cwyear ==> 2014 

这些都是商用日期,现在检查,

"Mon, 30 Dec 2013 00:00:00 UTC +00:00".to_date.year ==> 2013 

这是正常的一年。

This has a perfect example

相关问题