获得年度最佳一周

时间:2011-10-19 05:03:42

标签: delphi monthcalendar

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。

enter image description here

来源(0.5 Mb)http://www.sendspace.com/file/yuz6ko

根据组件MonthCalendar的初始代码判断 - 就像它是真的一样(即使不公开一周的第一天,它也取决于系统参数的值)。

在询问WeekOfTheYear它被告知,所有被认为也是标准的ISO应用,但数字不一致:(

无论如何,我不明白,一周消失 - 如果要查看日历,应该是43,如果考虑,那个星期53和去年的第一个问题......

顺便说一下,2011年1月1日的WeekOfTheYear也会回来52但是应该会返回1 ...

为什么要区别以及它在哪里?

3 个答案:

答案 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-0152,而不是53,嗯,这是根据definition of the first week by ISO

  

第一周是本周的第一个星期四。

2011年的第1周开始于1,前一个属于上一个ISO年。

答案 2 :(得分:2)

TMonthCalendar可以将一年中的最后一周视为下一年的第一周,WeekOfTheYear函数不会这样做,因此存在差异。

例如根据TMonthCalendar1 Jan 2012属于2011年的最后一周和2012年的第一周; 2 Jan 2012是2012年第二周的第一天 根据{{​​1}}函数,WeekOfTheYear仅属于2011年的最后一周; 1 Jan 2012是2012年第一个周的第一天。

周一是我一周的第一天。