【问题标题】:CultureInfo.GetCultureInfo("en-GB") doesn't compatible with en-US date format but fines with othersCultureInfo.GetCultureInfo("en-GB") 与 en-US 日期格式不兼容,但与其他格式不兼容
【发布时间】:2013-11-20 03:34:41
【问题描述】:

为什么第一行代码会抛出“String was not known as a valid DateTime.”异常?

en-GB 似乎与 en-US 不兼容,但奇怪的是与 zh-CN 和 ru-RU 日期格式字符串兼容。

是的,我可以简单地将文化信息更改为 en-US 以使其与 en-US 日期格式字符串兼容。但我的问题是,为什么 en-GB 可以使用 zh-CN 和 ru-RU 格式字符串?

有什么想法吗?

        var obj = DateTime.Parse("11/20/2013 3:10:36 AM", CultureInfo.GetCultureInfo(0x0809).DateTimeFormat);//en-US
        obj = DateTime.Parse("2013/11/20 3:16:08", CultureInfo.GetCultureInfo(0x0809).DateTimeFormat);//zh-CN
        obj = DateTime.Parse("20.11.2013 3:17:44", CultureInfo.GetCultureInfo(0x0809).DateTimeFormat); //ru-RU

0x0809 zh-CN 英语(英国)英语

谢谢,

【问题讨论】:

  • 为什么会令人惊讶?英国使用日/月/年格式,而美国使用月/日/年格式。它们绝对不同。
  • 那么为什么相同的文化信息适用于zh-CN和ru-RU中的日期格式字符串?
  • 俄罗斯的形式已经与英国的形式相似,只是使用了不同的分隔符。而中国的显然是从年份开始的……据推测它猜测下一个月份。当您有两个相邻的两位数值时,我怀疑它会尝试使用特定于文化的“正常”月份和日期顺序。
  • DateTime.Parse 真的搞砸了™。它会努力解释您的字符串,并且很容易在您不明智的情况下出错。尽可能使用DateTime.ParseExact

标签: c# datetime globalization


【解决方案1】:

您已指定在 en-GB 中期待 DateFormat,其格式通常为 dd/MM/yyyy ...,并且它正在尝试创建月份值为 20 的日期,但该日期不存在。

如果您将预期的输入格式更改为en-US,它将起作用并且您的内部日期将是正确的。然后,您可以根据需要将其输出为en-GB 格式

var obj = DateTime.Parse("11/20/2013 3:10:36 AM", CultureInfo.GetCultureInfo("en-US").DateTimeFormat);//en-US
string s = obj.ToString(CultureInfo.GetCultureInfo("en-GB").DateTimeFormat); //20/11/2013 03:10:36

【讨论】:

  • 我明白了。但对我来说,为什么 en-GB 文化信息与 zh-CN 和 ru-RU 中的日期格式字符串一起使用,这对我来说没有意义,它们的格式与 en-GB 的格式完全不同。
  • en-GB 解析将接受几种不同的格式和分隔符。最重要的是字符串中日期部分的顺序。
【解决方案2】:

我的猜测是 en-GB 与 zh-CN 兼容,因为该格式与 ISO 标准相同。然后它与 ru-RU 兼容,因为唯一的区别是分隔符。美国的格式既不是也不是,看起来很典型。解析器应该(但我没有检查)总是成功解析 ISO 格式(yyyy/mm/dd hh:mm:ss),这是跨语言数据模型的最佳使用案例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2017-10-20
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多