VB.NET DatetimePicker - 周数错误

VB.NET DatetimePicker - Wrong week number

我的 vbnet 扩展日期时间选择器有问题。 当元素传递到新年(2016)时,左边显示的周数是错误的。

我有一个 "datetimepicker" 不是默认组件,它是在此处下载的: http://www.codeproject.com/Articles/17063/ExtendedDateTimePicker-control-with-week-numbers

我不明白为什么日历从 53 到 2 而不是 53 到 1。

也许你们中有人有同样的错误。 谢谢你的时间。

I don't understand why the calendar pass from 53 to 2 and not 53 to 1

它几乎按预期工作。按照周数的计算方式,2016 年的前 3 天算作 2016 年的第一周。

请注意,该控件不执行任何与日历或显示相关的操作。它只是更改 Windows 提供的日历 window 的显示 样式 。在 CP 页面上看到的代码就是全部,主要是它只是设置了一个样式标志来告诉 Windows 添加周数:

style = style | MCS_WEEKNUMBERS;

它的 MSDN 条目表明:

Week 1 is defined as the first week that contains at least four days.

由于 1 月 1 日至 3 日不是 4 天,这似乎是出现错误,使用了不同的日历或 MSDN 已过时。


来自评论:

From what i understood, what's wrong is "date format". Maybe it's not a 8601

不,不仅如此:ISO8601 是 不同的日历,Windows 和 NET 都没有实现。 Wikipedia 备注:

The first week of a year is the week that contains the first Thursday of the year (and, hence, always contains 4 January). ISO week year numbering therefore slightly deviates from the Gregorian for some days close to 1 January.

这是您在日历下拉列表中看到的内容。

备选

但是 ISO8601 一年中的第几周很容易计算:

GetISOWeekOfYear() 代码开始。您可以使用它在标签或 DTP 旁边的内容中显示选定日期的 ISO8601 一年中的第几周。

打印 2011 年至 2021 年的第一周和最后一周的数字:

Dim cal As Calendar = CultureInfo.CurrentCulture.DateTimeFormat.Calendar
For n As Int32 = 2011 To 2017       '2021
    dt = New DateTime(n, 12, 21)
    Console.WriteLine(" ***** {0} *****", n)
    For j = 0 To 3
        Dim NetWk = cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, firstD)
        Console.WriteLine("Invariant Date: {0} ISO #:{1:00}  NET #:{2:00}",
                          dt.ToString("MM/dd/yyyy"), GetISOWeekOfYear(dt), NetWk)
        dt = dt.AddDays(7)
    Next
Next

2015/2016 部分的结果:

***** 2015 *****
Invariant Date: 12/21/2015 ISO #:52 NET #:52
Invariant Date: 12/28/2015 ISO #:53 NET #:53
Invariant Date: 01/04/2016 ISO #:01 NET #:02
Invariant Date: 01/11/2016 ISO #:02 NET #:03
***** 2016 *****
Invariant Date: 12/21/2016 ISO #:51 NET #:52
Invariant Date: 12/28/2016 ISO #:52 NET #:53
Invariant Date: 01/04/2017 ISO #:01 NET #:01
Invariant Date: 01/11/2017 ISO #:02 NET #:02

除非您愿意从头开始编写自己的控件或许可一个可以设置为不同日历的控件( 有 ISO8601 的定义),否则可能是尽力而为。

底线:周数没有错。它使用与您不同的日历 expect/want.


参考文献:

控件工作正常。

当年份发生变化时,一年的最后几天是在第 53 周 - 但不是整周。类似地,一年的前几天在第 1 周,但控件采用系统的 "first day of the week" 设置来确定第 2 周的开始时间 - 因此一年的第一周可能有从 1 到7 天。

这意味着您显示的图片显示的是第 53 周,因为您在 12 月,而第 2 周是因为 1 月的第 2 周从 4 日开始。

如果您导航到 1 月,它将显示从 12 月 28 日开始的行的第 1 周。

底线是 1 月的第一个星期只有 3 天。

这只是此控件正常且正确的行为。