MonthCalendar控件显示非ISO-8601兼容的周数

时间:2015-07-27 15:11:13

标签: .net visual-studio iso week-number monthcalendar

我遇到了MonthCalendar Windows窗体UI控件的问题。启用S​​howWeekNumbers属性后,它将显示2016年第1周为包含1月1日的星期,即星期五。这与ISO-8601不符,ISO-8601规定一年中的第一周是包含年份第一个星期四(第一个4天工作周)的一周。

MonthCalendar控件(SysMonthCal32)是公共控件库(comctl32.dll)的一部分。它在显示周数时使用MCS_WEEKNUMBERS样式。在MSDN站点的月日历控件样式页面上,它在MSC_WEEKNUMBERS的描述中提供以下语句:"第1周定义为包含至少四天的第一周。"不幸的是,这与我在控制中遇到的情况相反。

这里是photo of the MonthCalendar control,显示了上述问题。

2 个答案:

答案 0 :(得分:0)

周编号的计算由操作系统的用户区域设置决定。通过修改主执行线程的CurrentCulture和CurrentUICulture属性不会影响它。正如Microsoft Support article所述:

  

出现此问题的原因是DateTimePicker控件和MonthCalendar控件是Microsoft Windows常用控件。因此,操作系统的用户区域设置决定了这些控件的用户界面。

不幸的是,在应用程序运行时期间无法设置操作系统的用户区域设置。要达到ISO-8601标准,将需要自定义控件。这些culture-aware MonthCalendar and DateTimePicker controls on CodeProject应该做得很好。

答案 1 :(得分:0)

我收到了一份关于不相关的投诉。运行Windows窗体应用程序时显示的工作周数。

具体来说,问题来自于2016年1月1日和2日被确认为下周,在这种情况下,2016年的第一周 see the application displaying the wrong no. of the week, meaning 2 instead of 1

在大多数日历中,对于像奥地利,德国,瑞士这样的国家而言,2016年的第一周被认为是从1月4日开始的一周。

解决此问题的快速解决方案是在iFirstweekofYear寄存器中添加客户端PC,2而不是0(通过运行regedit访问此寄存器 - > HKEY_CURRENT_USER->控制面板 - >国际 - > iFirstWeekOfYear)

现在,当我再次运行应用程序时,会显示正确的一年中的一周: see the application displaying the correct no. of the week, meaning 1 instead of 2

我希望这会有所帮助。