.NET 4.5 DateTime 格式/转换错误与上索布文化

Posted

技术标签:

【中文标题】.NET 4.5 DateTime 格式/转换错误与上索布文化【英文标题】:.NET 4.5 DateTime format/convert bug with Upper Sorbian culture 【发布时间】:2012-09-11 01:22:25 【问题描述】:

使用上索布语文化 (hsb),转换为字符串的 DateTime 对象使用格式“d. M. yyyy H.mm.ss 'hodź.'”。例如,ToString("G") 返回“31. 12. 2011 5.06.07 hodź”。 2011 年 12 月 31 日上午 05:06:07。

问题在于尝试将这样的字符串转换回 DateTime 不会导致结果为真。甚至更简单的字符串,如“1. 1. 2011”或“1.1.2011”也不会成功。以防万一有人建议在转换/持久化时传递文化:我当然这样做了。

尝试解析“1.2.3”会导致当前日期为 01:02:03。

我认为这是一个错误。或者有人知道可能出了什么问题吗?

我在 Windows 8 RTM 机器上使用 .NET 4.5 RTM。

示例:

DateTime date = DateTime.Now;

CultureInfo culture = new CultureInfo("hsb");
string dateString = date.ToString("G", culture);
DateTime convertedDate; 

bool dateOkay = DateTime.TryParse(dateString, culture,
   DateTimeStyles.AllowInnerWhite, out convertedDate);
Console.WriteLine(dateOkay); 
// This results false although the date string was read by 
// ToString("G") (i.e. '20. 9. 2012 12.28.10 hodź.') and should be okay

dateString = "1. 1. 2000";
dateOkay = DateTime.TryParse(dateString, culture,
   DateTimeStyles.AllowInnerWhite, out convertedDate);
Console.WriteLine(dateOkay); 
// This results in false although the date string should be okay

dateString = "1.1.2000";
dateOkay = DateTime.TryParse(dateString, culture,
   DateTimeStyles.AllowInnerWhite, out convertedDate);
Console.WriteLine(dateOkay); 
// This results also in false

dateString = "1.2.3";
dateOkay = DateTime.TryParse(dateString, culture,
   DateTimeStyles.AllowInnerWhite, out convertedDate);
Console.WriteLine(dateOkay + ": " + convertedDate); 
// This results strangely in true. The converted date is the current date 
// with time 01:02:03.

【问题讨论】:

嗯。您的第一个示例适用于我,来自 Windows 7,但使用 .NET 4.5 RTM。你能把它编辑成一个简短但完整的控制台应用程序吗? 您的评论者指出了一些正确的答案,但您的问题都没有标记为已回答。您确实知道检查表明答案正确。 @Jon:听起来像是 Windows 8 上的问题(Microsoft 更改了许多日期格式)。这是简化但工作的控制台应用程序代码: CultureInfoculture = new CultureInfo("hsb"); DateTime date = new DateTime(2011, 12, 31, 5, 6, 7); string dateString = date.ToString("G",culture);日期时间转换日期; bool dateOkay = DateTime.TryParse(dateString,culture, DateTimeStyles.AllowInnerWhite, out convertDate); Console.WriteLine(dateOkay); dateString = "1. 1. 2000"; dateOkay = DateTime.TryParse(dateString,culture, DateTimeStyles.AllowInnerWhite, out convertDate); Console.WriteLine(dateOkay); dateString = "1.1.2000"; dateOkay = DateTime.TryParse(dateString, 文化, DateTimeStyles.AllowInnerWhite, out convertDate); Console.WriteLine(dateOkay); dateString = "1.2.3"; dateOkay = DateTime.TryParse(dateString, 文化, DateTimeStyles.AllowInnerWhite, out convertDate); Console.WriteLine(dateOkay); Console.WriteLine(convertedDate); @JürgenBayer:请在您的问题中编辑控制台应用程序 - cmets 中的代码读起来不太好。 【参考方案1】:

在 .Net 4.5 中,“hsb”被标记为中性文化,因此所有 DateTime 解析都将由标准格式提供程序完成。请改用带有格式字符串的 DateTime.ParseExact。 http://www.codeproject.com/Articles/3612/Use-of-different-Date-Time-formats-and-Culture-typ

=================================

我发现当 CultureInfo 中的标志“IsNeutralCulture”等于“true”时,日期字符串以不变格式解析(en-US)。当我通过格式 MM/dd/yyyy DateTime.TryParse 为文化“hsb”正确解析日期时。

还有我提供的文章中的一些引用:“DateTimeFormatInfo 只能为不变文化或特定文化创建,而不是为中性文化创建。DateTimeFormatInfo 继承自 Object 并实现 ICloneable 和 IFormarProvider 接口。”

我发现 DateTimeFormatInfo 是为“hsb”文化指定的,但正如我之前所说,IsNeutralCulture = true。当“IsNeutralCulture”等于“true”时,我希望.Net framework 4.5 DateTimeFormatInfo 不用于解析日期

【讨论】:

“hsb”当然是一种中性文化。就像“en”或“de”一样。 “标准格式提供者”是什么意思。即使对于中性文化,也会使用适当的格式提供程序。尝试任何中立的文化。问题不在于如何格式化日期。我想得到的字符串适合上索布文。问题是格式化的日期在尝试解析时未被识别为日期。

以上是关于.NET 4.5 DateTime 格式/转换错误与上索布文化的主要内容,如果未能解决你的问题,请参考以下文章

如何解析 DateTime 并将其转换为 RFC 822 日期时间格式?

将.NET DateTime 转换为 JSON [重复]

如何从 ISO 8601 格式创建 .NET DateTime

如何将 DateTime .NET 数据类型转换为 W3C XML DateTime 数据类型字符串并返回?

将 ISO::DateTime 转换为数字格式

C# 将 DateTime 转换为 Sql Server 2005 格式