DateTime.Parse不会根据线程文化反转月和日

时间:2014-05-09 14:08:54

标签: c# datetime globalization

我正在从数据库中解析日期字符串,以便我可以在UI线程的当前文化中显示它。由于某种原因,日期不是针对文化进行解析 - 具体来说,我正在解析一个en-US日期以切换到es-ES日期,并且月/日位置没有切换。

根据this MSDN article,我应该能够使用Parse只使用日期字符串作为参数。我还应该能够明确地提供一个文化对象。无论是工作还是我的日期都保持为mm / dd而不是dd / mm。我已经验证了线程的CurrentCulture和CurrentUICulture都设置正确,如果我做了一个新的DateTime,那么输出正确。

我错过了什么吗?

编辑:代码中没有任何东西,只有.NET API。

CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
DateTime formattedDate = DateTime.Parse("5/9/2014");
formattedDate.ToShortDateString(); //this returns 5/9/2014
DateTime.Today.ToShortDateString(); //this returns 9/5/2014

2 个答案:

答案 0 :(得分:3)

您遇到的问题是5/9/2014是dd / mm / yyyy或mm / dd / yyyy格式的完全有效的月份字符串,因此当您执行DateTime.Parse("5/9/2014")时,它会成功解析为2014年9月5日(因为日期格式为dd / mm / yyyy)。

然后解释了为什么当你输出时会得到与DateTime.Today不同的东西(显然是5月9日)。

您的计划的工作版本将是:

var outputCulture = CultureInfo.CreateSpecificCulture("es-es");
var inputCulture = CultureInfo.CreateSpecificCulture("en-us");
Thread.CurrentThread.CurrentCulture = outputCulture;
Thread.CurrentThread.CurrentUICulture = outputCulture;
DateTime formattedDate = DateTime.Parse("5/9/2014", inputCulture);
Console.WriteLine(formattedDate.ToShortDateString()); //this returns 09/05/2014
Console.WriteLine(DateTime.Today.ToShortDateString()); //this returns 09/05/2014

如您所见,我正在为输入指定文化,以便它知道使用en-us文化而不是显式设置es-es文化进行解析。

答案 1 :(得分:0)

由于您正在从数据库解析字符串,因此正确执行此操作的唯一方法是将字符串保持为不依赖于任何特定于区域性的数据的标准格式。 ISO 8601定义了适合此的格式,您可以使用自定义格式字符串来实现此目的。您也可以使用.Net' o'往返的格式说明符。有关详细信息,请参阅How to: Round-trip Date and Time Values

文化特定设置确实会更改并导致过去解析的项目,即使您知道用于格式化值的文化,也无法解析。

特定于文化的格式化和解析是短暂的,仅用于与用户交互。

相关问题