8

Delphi Xe, Win 7, System TimeZone UTC+4:0, 系统一周的第一天-星期一,时间与time.windows.com同步

在标准组件 Delphi Win32 的调色板中有组件 MonthCalendar,其属性 WeekNubers=true(显示周数),日期=现在,第一天 - 星期一。

显示在 19 号(今天) - 第 43 周。

我通过 dateutils.WeekOfTheYear(now) = 返回 42 请求编号。

在此处输入图像描述

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

从组件 MonthCalendar 的初始代码来看 - 这一切都是真的(即使不公开一周的第一天,它也会从系统参数中获取价值)。

并且在查询 WeekOfTheYear 中被告知,所有这些都被认为也应用了标准 ISO,但数字不一致:(

无论如何,我都不会明白,一周会在哪里消失——如果看日历,应该是 43 周,如果要考虑,那一周是 53 周和去年的第一个问题......

顺便说一句,2011 年 1 月 1 日的 WeekOfTheYear 也返回 52,尽管应该返回 1...

为什么要区分,哪里是正确的?

4

3 回答 3

12

两个结果都是正确的,不同之处在于DateUtils.WeekOfTheYear函数使用了ISO 8601标准定义的一周。That is, a week is considered to start on a Monday and end on a Sunday.

检查有关 ISO 8601 格式的周数的说明。

如果 1 月 1 日在星期一、星期二、星期三或星期四,则在第 01 周。如果 1 月 1 日在星期五、星期六或星期日,则在上一年的第 52 或 53 周(没有第 00 周) . 12 月 28 日总是一年中的最后一周。

DateUtils.WeekOfTheYear功能的 Embarcadero 在线帮助还说

....如果一年中的第一个日历日是星期五、星期六或星期日,那么对于日历年的前三天、两天或一天,WeekOfTheYear 返回上一年的最后一周。同样,如果一年中的最后一个日历日是星期一、星期二或星期三,那么对于日历年的最后一天、两天或三天,WeekOfTheYear 返回 1(下一个日历年的第一周)。

因此,由于本周 01-01-2011 是星期六,因此被认为是上一年的第 52 周。

这也解释了为什么今天(19-10-2011)返回的周数是 42 而不是 43。

于 2011-10-19T05:31:17.507 回答
2

首先,我看不出TMonthCalendar组件中的周数与DateUtils.WeekOfTheYear(). (星期一是我系统上一周的第一天。)都显示42当前周和52(不53)显示2011-01-01. (它是53为了2010-01-01,所以也许你只是把它弄混了。)

现在,至于为什么是52or 53,而不是1,嗯,这是根据ISO 对第一周的定义

第一周是一年中第一个星期四所在的那一周。

所以 2011 年的第 1 周从 开始2011-01-03,前一周属于上一个 ISO 年份。

于 2011-10-19T05:34:34.447 回答
2

可以将TMonthCalendar一年中的最后一周视为下一年的第一周,WeekOfTheYear函数不这样做,因此有所不同。

例如根据TMonthCalendar,1 Jan 2012属于 2011 年最后一周和 2012 年第一周;是2012年第二2 Jan 2012周的第一天。 根据功能, 只属于2011年的最后一周;是2012 年第一周的第一天。
WeekOfTheYear1 Jan 20122 Jan 2012

星期一对我来说是一周的第一天。

于 2011-10-19T06:21:43.453 回答