在另一种文化中将字符串转换为日期

时间:2014-11-11 14:57:16

标签: c# datetime

我正在尝试将字符串(表示invariantCulture中的日期)转换为给定文化中的dateTime。问题是,当日期转换为德国文化时,日期变为月份,月份变为白天。 下面的代码有什么问题,或者我错过了什么?

var day = 11; var month = 12; var year = 2014;

var someDate = new DateTime(year, month, day);
var theDay = someDate.Day;//11 ok as expected
var theMonth = someDate.Month; //12 ok as expected

var dateString = someDate.ToString(CultureInfo.InvariantCulture);

var date1 = DateTime.Parse(dateString, CultureInfo.GetCultureInfo("de-De"));
var day1 = date1.Day;//12 this should be 11 ?
var month1 = date1.Month; //11 this should be 12 ?

4 个答案:

答案 0 :(得分:5)

DateTime.Parse的第二个参数用于告诉解析器字符串的格式,而不是要将其转换为的格式。您正在生成一个不变的字符串,然后将其解析为德语字符串,这就是您的日期和月份被交换的原因。

如果您的目标是获取日期的德语字符串表示,请使用var dateString = someDate.ToString(CultureInfo.GetCultureInfo("de-DE"))

答案 1 :(得分:2)

我认为de-De文化的标准日期和时间格式不是MM/dd/yyyy HH:mm:ss

由于您使用DateTime.ToString()方法InvariantCulture,因此结果字符串为"G" standard formatMM/dd/yyyy HH:mm:ssInvariantCulture

正因为如此,dateString12/11/2014 00:00:00de-DE文化没有标准的日期和时间格式MM/dd/yyyy HH:mm:ss,但有dd/MM/yyyy HH:mm:ss这是dd.MM.yyyy HH:mm:ss文化的de-DE

为什么DateTime.Parse方法匹配dd/MM/yyyy HH:mm:ss模式的原因(因为它DateSeparator . dd.MM.yyyy HH:mm:ss应该是12格式)。

这就是为什么它将您的Day解析为11,将Month解析为DateTime

如果您已经.ToString()(您拥有),只需使用de-DE方法与var culture = new CultureInfo("de-De"); var dateString = someDate.ToString(culture); 文化一样;

DateTime

请注意,String没有任何隐式格式或文化。它只有日期和时间值。它们的de-DE表示可以有格式。

顺便说一句,您可以找到var culture = new CultureInfo("de-De"); foreach (var format in culture.DateTimeFormat.GetAllDateTimePatterns()) { Console.WriteLine(format); } 文化的所有标准日期和时间模式;

{{1}}

答案 2 :(得分:0)

更改以下行并再次测试:

 var dateString = someDate.ToString(CultureInfo.InvariantCulture);

为:

 var dateString = someDate.ToString("O");

或:

 var dateString = someDate.ToString("S");

答案 3 :(得分:0)

好吧,这就是我想你要完成的事情,不确定我是否做对了:你想读一个不变的文化日期字符串并将其转换为德国文化日期字符串。 但在你的例子中,你试图解析一个不变的文化日期作为德国文化日期。当然这会导致误解。试试这个:

string invariantCultureDateString = "12/11/2014 00:00:00";
var dateTime = DateTime.Parse(invariantCultureDateString, CultureInfo.InvariantCulture);
string germanCultureDateString = dateTime.ToString(CultureInfo.GetCultureInfo("de-De"));

BR