正在将字符串转换为其他区域性中的日期

本文关键字:区域性 日期 其他 字符串 转换 | 更新日期: 2023-09-27 18:30:04

我正在尝试将字符串(表示不变量文化中的日期)转换为给定文化中的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 ?

正在将字符串转换为其他区域性中的日期

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

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

我猜de-De区域性没有MM/dd/yyyy HH:mm:ss的标准日期和时间格式。

由于您将DateTime.ToString()方法与InvariantCulture一起使用,因此结果字符串将为"G"标准格式,即InvariantCultureMM/dd/yyyy HH:mm:ss

因此,dateString将是12/11/2014 00:00:00,而de-DE区域性没有标准的日期和时间格式MM/dd/yyyy HH:mm:ss,而是具有dd/MM/yyyy HH:mm:ss,这是de-DE区域性的dd.MM.yyyy HH:mm:ss

这就是为什么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);
}

更改以下行并再次测试:

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

至:

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

或:

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

好的,这是我认为你想要实现的,不确定我是否正确:你想要读取一个不变的培养日期字符串,并将其转换为德语培养日期字符串。但在您的示例中,您试图将一个不变的培养日期解析为德国培养日期。这当然会导致误解。试试这个:

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

BR