泰国/佛教时代时间的 DateTime.ParseExact 问题

Posted

技术标签:

【中文标题】泰国/佛教时代时间的 DateTime.ParseExact 问题【英文标题】:DateTime.ParseExact problem with Thai / Buddhist Era Time 【发布时间】:2011-07-29 04:04:03 【问题描述】:

客户端使用我们的应用程序从我们的服务器下载文件后,该应用程序对从服务器下来的日期字符串执行ParseExact,格式为:yyyy/mm/dd HH:mm:ss

经过一番困惑后,我在一些日志中注意到客户端系统上的日期是19/7/2554。事实证明这是泰国的有效时间,Windows 默认为佛教时代时间系统,即 2554 年。

我的解析是使用不变的文化完成的,我怀疑这可能是问题所在,但我认为文化是指您尝试解析的格式?

我收到的异常消息是:字符串未被识别为有效的DateTime,因为星期几不正确

【问题讨论】:

您的格式似乎根本不包括星期几。你能举一个你试图解析的字符串和正在解析的代码的例子吗? 您确实在指定格式列表吗? 啊,我的坏人,我搞砸了。原来还有一段我什至不知道的代码正在运行。仅使用来自日志文件的异常消息进行调试非常困难。原来这是一个 DateTime.Parse 错误,而不是 parseexact。我能够通过将我的 PC 的区域更改为泰国来复制该问题,并准确查看它的死机。 我相信不变文化不应该给你带来问题,这是我认为正确的解析方式,这样无论不同文化的具体格式如何,你的代码都能正常工作。如果 InvariantCulture 不适合您,我会很感激了解您的问题,因为我自己正在为我的项目使用 Invariant Culture。 【参考方案1】:

CultureInfo 还包含日历信息。如果 TryParseExact 方法可以访问正确的日历信息,那么它将能够正确解析日期。

http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.calendar.aspx

如果您将 InvariantCulture CultureInfo 替换为 Thai CultureInfo,则将使用该文化的默认日历。

或者,您可以使用不需要 CultureInfo 的 TryParse 方法的重载。在这种情况下使用的文化将取决于用户在 Windows 中的区域设置。

【讨论】:

以上是关于泰国/佛教时代时间的 DateTime.ParseExact 问题的主要内容,如果未能解决你的问题,请参考以下文章

DateTime.Parse 美国日期格式 C#

DateTime.Parse 和 Convert.ToDateTime 之间有啥区别?

在 DateTime.parse() 中允许空字符串

Ruby 中的 DateTime.parse() 是不是依赖于语言环境?

C#中的时间类

拆分时间段