Delphi Xe,Win 7,System TimeZone UTC + 4:0,系统中一周的第一天 - 星期一,时间与time.windows.com同步
在标准组件Delphi Win32的调色板中有组件MonthCalendar,其属性为WeekNubers = true(显示周数),date = now,第一天 - 星期一。
显示19号码(今天) - 星期43号。
我通过dateutil请求号码.WeekOfTheYear(now)=返回42。
来源(0.5 Mb)http://www.sendspace.com/file/yuz6ko
根据组件MonthCalendar的初始代码判断 - 就像它是真的一样(即使不公开一周的第一天,它也取决于系统参数的值)。
在询问WeekOfTheYear它被告知,所有被认为也是标准的ISO应用,但数字不一致:(
无论如何,我不明白,一周消失 - 如果要查看日历,应该是43,如果考虑,那个星期53和去年的第一个问题......
顺便说一下,2011年1月1日的WeekOfTheYear也会回来52但是应该会返回1 ...
为什么要区别以及它在哪里?
答案 0 :(得分:11)
两个结果都是正确的,区别在于DateUtils.WeekOfTheYear
函数使用一周的 ISO 8601 标准定义。 That is, a week is considered to start on a Monday and end on a Sunday.
检查此explanation有关ISO 8601格式的周数。
如果1月1日是星期一,星期二,星期三或星期四,那么它就在 第01周。如果1月1日是星期五,星期六或星期日,那么它就在 上一年的第52周或第53周(没有第00周)。 12月28日 总是在一年的最后一周。
DateUtils.WeekOfTheYear
功能的Embarcadero在线帮助
....如果一年中的第一个日历日是星期五,星期六或 星期日,然后是日历的前三天,两天或一天 year,WeekOfTheYear返回上一年的最后一周。 同样,如果一年中的最后一个日历日是星期一,星期二, 或者星期三,然后是最后一天,两天或三天 日历年,WeekOfTheYear返回1(下一个的第一周) 历年)。
因此,本周六01-01-2011被认为是上一年的第52周。
这也解释了为什么今天(19-10-2011)返回的周数是42而不是43。
答案 1 :(得分:2)
首先,我发现TMonthCalendar
组件中的周数与DateUtils.WeekOfTheYear()
返回的周数没有区别。 (星期一是我系统上一周的第一天。)本周显示42
,{} 52
(不是53
) {1}}。 (对于2011-01-01
,它是53
,所以也许你只是混淆了它。)
现在,为什么它是2010-01-01
或52
,而不是53
,嗯,这是根据definition of the first week by ISO:
第一周是本周的第一个星期四。
2011年的第1周开始于1
,前一个属于上一个ISO年。
答案 2 :(得分:2)
TMonthCalendar
可以将一年中的最后一周视为下一年的第一周,WeekOfTheYear
函数不会这样做,因此存在差异。
例如根据TMonthCalendar
,1 Jan 2012
属于2011年的最后一周和2012年的第一周; 2 Jan 2012
是2012年第二周的第一天
根据{{1}}函数,WeekOfTheYear
仅属于2011年的最后一周; 1 Jan 2012
是2012年第一个周的第一天。
周一是我一周的第一天。