我正在尝试将字符串(表示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 ?
答案 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 format,MM/dd/yyyy HH:mm:ss
为InvariantCulture
。
正因为如此,dateString
将12/11/2014 00:00:00
和de-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