【问题标题】:Incorrect default DateTimeFormat.ShortDatePattern for culture es-DO文化 es-DO 的默认 DateTimeFormat.ShortDatePattern 不正确
【发布时间】:2013-09-15 23:03:35
【问题描述】:

我住在多米尼加共和国,几年来一直在使用 .NET Framework 开发应用程序。通常,我会为这种特定文化 (es-DO) 创建本地化应用程序,使用内置的 .NET 全球化机制对我非常有帮助。对于 Web 应用程序,我通常在 Web.Config 中定义全局文化:

<globalization culture="es-DO" uiCulture="es-DO" />

但是DateTimeFormatShortDatePattern 中存在一个问题,这种文化给我和其他开发人员造成了困惑。由于未知的原因,默认的ShortDatePattern 格式是d/M/yy,而实际上这个国家使用的常规格式是dd/MM/yyyydd-MM-yyyy,就像大多数其他西班牙语国家一样(顺便说一句,配置正确) .

我创建了一个小型控制台应用程序来更好地说明:

我已经在几台 PC 上确认了相同的行为,甚至将我的 Web 应用程序发布到 Windows Azure 等托管服务提供商。

我一直在寻找有关该主题的信息,但对于这种特定的(我可能会添加的不太受欢迎的)文化来说,这似乎是一个非常本地化的问题,因此很难找到任何文档。

基本上,我对此有两个问题:

  • 他们如何知道正确的文化格式?他们做了什么研究?这是否记录在我可以查看的某个地方?而且,
  • 是否可以解决此问题,而无需在我的应用程序的任何地方指定所需的格式?

编辑

这已被报告为 Microsoft ConnectVisual Studio Forums 中的一个错误。

【问题讨论】:

标签: .net datetime globalization cultureinfo


【解决方案1】:

他们如何知道正确的文化格式?他们做了什么研究?这是否记录在我可以查看的某个地方?

是否可以解决这个问题而不必在我的应用程序中的任何地方指定所需的格式?

  • 当然,只需更改当前线程的文化:

    var currentCulture = Thread.CurrentThread.CurrentCulture;
    if (currentCulture.Name == "es-DO")
    {
        var culture = (CultureInfo) currentCulture.Clone();
        culture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
        Thread.CurrentThread.CurrentCulture = culture;
    }
    
  • 在 Web 应用程序中,您可以在 global.asax.cs 文件的 Application_BeginRequest 中执行此操作,它将贯穿您的整个应用程序。

【讨论】:

    【解决方案2】:

    .Net 从 Windows 获取数据(至少从 .Net 4.0 开始就有——即使在以前的版本中,唯一的区别在于最终的默认数据)。短日期模式通过调用GetLocaleInfoEx 返回,LCTYPE 为LOCALE_SSHORTDATE

    返回适当数据的过程有效(有优化)检查请求的语言环境名称(在您的情况下为“es-DO”)是否是当前用户语言环境,如果是,请检查并查看如果有用户请求覆盖该值。如果有,则返回,如果没有,则如果安装了替换默认数据的自定义区域性,则返回该数据。最后返回默认提供的数据。

    默认数据是 Microsoft 维护的内部数据库的一部分。该数据库已经维护了很长时间,并由国家语言专家定期审查。如果您看到一些看起来不正确的东西并且您是母语人士,您应该将其报告为错误。有时,合法地表达数据的方式不止一种,而演讲者本身对于哪种方式是“正确的”方式存在分歧。这就是用户可以覆盖用户区域设置的默认值的原因。

    有几个选项可以解决这个问题:

    1. 当 es-DO 是用户区域设置时,更改短日期的用户默认设置(语言和区域控制面板)
    2. 创建替代 es-DO 的自定义文化
    3. 在您的代码中,选择一个包含 4 位数年份的模式。 (您期望的模式在数据中,但不是默认模式)

    如果你选择做最后一个,你会想看看DateTimeFormatInfo.GetAllDateTimePatterns 方法。使用 'd' 格式获取所有短日期格式,然后您可以找到第一个包含“yyyy”的格式。

    【讨论】:

    • 谢谢!这真的对我有帮助。你说这是一个 Windows 问题,你能告诉我应该在哪里报告这个问题吗?
    • 提供反馈的最佳方式是参与Windows 8.1 Preview forum。在 Windows 8.1 Preview 论坛上发布有关您的问题的“错误报告”。在您的帖子中,描述您看到的结果(d/M/yy 是为 es-DO 提供的第一个短日期模式)以及您期望的结果(dd/MM/yyyy)。你可以链接到这篇文章。我们正在监视 Windows 8.1 Preview 论坛,可能会要求您在此处发布其他理由。如果您想针对 .Net 记录错误,请使用 connect.microsoft.com
    【解决方案3】:

    您可以尝试使用create custom cultures的工具。

    我之前没有详细做过,但看起来你可以覆盖 es-DO 指向的内容。

    请注意,这只会涵盖服务器端,而不是客户端(javascript)。

    【讨论】:

    • 很棒的帖子。但问题的一部分也集中在为什么这是默认设置?这是一个错误,我们可以以某种方式处理它,但不应该这样。
    • @Meryovi:我总是觉得很奇怪,在答案中包括“我不确定____”,但你是对的。我所知道的唯一国际化信息与时区有关,我在几次尝试查找有关格式的信息时都没有成功。我会假设有人推出的数据库在它背后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多