我的vbnet扩展日期时间选择器出了问题。 当元素传递到新年(2016)时,左侧显示的周数是错误的。
我有一个“datetimepicker”,它不是默认组件,它是在这里下载的: http://www.codeproject.com/Articles/17063/ExtendedDateTimePicker-control-with-week-numbers
我不明白为什么日历从53转到2而不是53到1。
也许你们其中一个人有同样的错误。 谢谢你的时间。
答案 0 :(得分:3)
I don't understand why the calendar pass from 53 to 2 and not 53 to 1
它几乎按预期工作。计算周数的方式,2016年的前3天计为2016年的第一周。
请注意,控件不会执行任何与日历或显示相关的操作。它只是更改Windows提供的日历窗口的显示样式。在CP页面上看到的代码就是全部,主要是它设置一个样式标志来告诉Windows添加周数:
style = style | MCS_WEEKNUMBERS;
它的MSDN条目表示:
第1周被定义为包含至少4天的第一周。
由于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注意:
一年的第一周是包含一年中第一个星期四的一周(因此,总是包含1月4日)。因此,ISO周年编号因接近1月1日的某些天而略微偏离格里高利。
这是您在日历下拉列表中看到的内容。
<强>替代强>
但ISO8601周年很容易计算:
从my answer to a very similar question开始使用GetISOWeekOfYear()
的代码。您可以使用它来显示标签中所选日期的一年中的ISO8601周或DTP旁边的某些内容。
打印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 *****
不变日期:2015年12月21日ISO#:52 NET#:52
不变日期:2015年12月28日ISO#:53 NET#:53
不变日期:01/04/2016 ISO#:01 NET#:02
不变日期:01/11/2016 ISO#:02 NET#:03
***** 2016 *****
不变日期:12/21/2016 ISO#:51 NET#:52
不变日期:12/28/2016 ISO#:52 NET#:53
不变日期:01/04/2017 ISO#:01 NET#:01
不变日期:01/11/2017 ISO#:02 NET#:02
除非您愿意从头开始编写自己的控件或者可以设置为不同日历的许可证(和具有ISO8601的定义),否则这可能是您可以做的最好的。
底线:周数没有错。它使用的日历与您期望/想要的不同。
参考文献:
答案 1 :(得分:1)
控件运行正常。
当年度最后几天的变化发生在第53周时 - 但这不是整整一周。类似地,一年的前几天是在第1周,但是控制系统的“一周的第一天”设置确定第2周何时开始 - 所以一年中的第一周可能有任何来自在其中1至7天。
这意味着您显示的图片显示的是第53周,因为您在12月和第2周,因为1月的第2周确实从第4周开始。
如果您导航到1月,它将显示从12月28日开始的行的第1周。
最重要的是,1月的第一周只有3天。
这只是此控件的正常和正确行为。