如何在C#中将字符串解析为日期时间?

4
string dateString = "12/9/2014 10:09:28 AM";
DateTime dateTime;

if (DateTime.TryParse(dateString, CultureInfo.GetCultureInfo("en-GB"),
    DateTimeStyles.AssumeUniversal, out dateTime))
{
   Console.WriteLine(dateTime); //"9/12/2014 10:09:28 PM";
}

当我使用"en-US"进行相同操作时,它们会交换为"12/9/2014 10:09:28 PM"
为什么交换了日和月呢?
他们如何知道哪里是日,哪里是月?

2
你的电脑文化是什么?我想答案就是 - 你的文化将日期时间格式设置为 MM/DD/YYYY,而你指定日期应该是 DD/MM/YYYY(这是 en-GB 中显示日期的方式)。 - user1666620
2个回答

7
他们交换月份和日期是因为在美国,日期格式为月/日/年,在英国(以及大多数其他国家)的日期格式为日/月/年。因此,在美国,“2014年12月9日”表示为“12/9/2014”,而在英国则表示为“2014年9月12日”。
这些信息由CultureInfo.DateTimeFormat确定。
这意味着您无法在不知道日期字符串来自哪个文化的情况下解释日期字符串。

5
那是因为每个文化都可以有自己的日期和时间表示法。解释取决于你的文化,就像在美国裤子指裤子,但在英国指内裤一样!
en-GB culture中,日期按“日月年”的顺序书写,在en-US culture中,日期按“月日,年”的顺序书写。
为了避免出现意外或依赖机器的文化,您可以使用CultureInfo.InvariantCulture或使用ParseExact
如果您没有指定文化,就像在您的TryParse调用中一样,默认为当前线程的文化,即机器的文化。您可能将en-US作为您的文化,您可以在控制面板>区域和语言中检查此设置。

但是12可以是一个日期和一个月份。 - Anatoly
@Anatoly 是的,它可以同时是两者,但使用的文化决定了其解释。 - YetAnotherCoder
@ 但我没有指定任何文化。 - Anatoly
@Anatoly,你还没有设置,但它默认使用系统的文化(如果需要,你可以更改正在运行的应用程序的文化)。 - crashmstr
2
@Anatoly,如果您不指定一个文化(culture),就像在您的 TryParse 调用中一样,它会默认使用当前线程的文化,即机器的文化。 - YetAnotherCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接