【问题标题】:MonthCalendar control displaying non ISO-8601 compliant week numbersMonthCalendar 控件显示不符合 ISO-8601 的周数
【发布时间】:2015-07-27 15:11:13
【问题描述】:

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

MonthCalendar 控件 (SysMonthCal32) 是公共控件库 (comctl32.dll) 的一部分。它在显示周数时使用 MCS_WEEKNUMBERS 样式。在 MSDN 站点的 Month Calendar Control Styles 页面上,它在 MSC_WEEKNUMBERS 的描述中提供了以下语句:“第 1 周定义为包含至少四天的第一周。”不幸的是,这与我对控件的体验相反。

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

【问题讨论】:

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


    【解决方案1】:

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

    具体来说,问题在于 2016 年 1 月 1 日和 2 日被识别为下周,在本例中为 2016 see the application displaying the wrong no. of the week, meaning 2 instead of 1 的第一周

    但在大多数日历中,对于奥地利、德国、瑞士等国家/地区,2016 年的第一周被认为是从 1 月 4 日开始的那一周。

    解决此问题的快速解决方案是在客户端 PC 上添加 iFirstweekofYear 寄存器中的 2 而不是 0(通过运行 regedit->HKEY_CURRENT_USER->Control Panel->International->iFirstWeekOfYear 访问此寄存器)

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

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      很遗憾,在应用程序运行期间无法设置操作系统的用户区域设置。要实现 ISO-8601 合规性,需要自定义控制。这些culture-aware MonthCalendar and DateTimePicker controls on CodeProject 应该做得很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多