正在将字符串转换为其他区域性中的日期
本文关键字:区域性 日期 其他 字符串 转换 | 更新日期: 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"
标准格式,即InvariantCulture
的MM/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