【问题标题】:Get Week Of The Year获得一年中的一周
【发布时间】:2011-12-10 15:10:18
【问题描述】:

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

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

在 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...

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

【问题讨论】:

    标签: delphi monthcalendar


    【解决方案1】:

    两个结果都是正确的,区别在于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 周。

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

    【讨论】:

    • MonthCalendar 组件基于 Windows 月历控件,并根据您传递给 FirstDayofWeek 属性的值计算周数。
    • 我已经写过,MonthCalendar 中的星期一是由第一个注册的(我尝试在系统中插入默认值:系统中的值 - 在选项日期和时间窗口中也是星期一),但是值返回不同。在我阅读了有关 ISO 标准的询问中,就像在这两种情况下都应该正常工作一样,我不明白,为什么不同:(
    • 您是否希望MonthCalendar 组件显示相同的周数,由WeekOfTheYear 函数返回?
    • 是的,我在一个问题中添加了屏幕和源代码,请看
    【解决方案2】:

    首先,我发现TMonthCalendar 组件中的周数与DateUtils.WeekOfTheYear() 返回的周数没有区别。 (星期一是我系统上一周的第一天。)都显示当前一周的 422011-01-01 的一周的 52(不是 53)。 (2010-01-0153,所以也许你只是把它弄混了。)

    现在,至于为什么是5253,而不是1,嗯,根据definition of the first week by ISO

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

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

    【讨论】:

    • 是的,有 53 次输入错误,脑子已经沸腾了。已于 52 日更正
    【解决方案3】:

    TMonthCalendar 可以把当年的最后一周当做下一年的第一周,WeekOfTheYear 函数不做,所以有区别。

    例如根据TMonthCalendar1 Jan 2012同时属于2011年最后一周和2012年第一周; 2 Jan 2012 是 2012 年第二周的第一天。
    根据WeekOfTheYear函数,1 Jan 2012只属于2011年最后一周; 2 Jan 2012 是 2012 年第一周的第一天。

    星期一是我一周的第一天。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多