日期时间的奇怪行为

6

我创建了一个C# WinForms应用程序。

在我的电脑上,以下内容可以正常工作:

DateTime.ParseExact("13/05/2012", "dd/mm/yyyy",  null)

但这个不行:
DateTime.Parse("13/05/2012")

在我的客户电脑上,它是反向的。这个可以解决:

DateTime.Parse("13/05/2012")

但这并不行:
DateTime.ParseExact("13/05/2012", "dd/mm/yyyy",  null)

错误提示为:

该错误内容如下:

String was not recognized as a valid DateTime.

在互联网上没有找到有关此问题的任何信息。该程序使用 .Net Framework 4 并且是一个 x86 应用程序。我运行 Windows 8 x64,客户端运行 Windows 7 x64。

有人知道为什么会出现这种情况吗?

谢谢。


2
我怀疑与系统的 CultureInfo 日期时间格式有关的差异,但请详细说明“不起作用”是什么意思。它会产生错误吗?错误信息是什么? - Dan J
1
@DanJ 当他使用ParseExact方法时,它在客户端计算机上将其解析为“05/13/2012”,但对他有效。我同意检查CultureInfo。 - SimpleVar
4
统一采用ISO的“yyyy-MM-dd”格式的另一个原因。 =) - MCattle
2
@Vlad:你所有的“mm”都应该改成“MM”。 - dance2die
2个回答

12

你在不同电脑上看到不同的行为是因为它们使用了不同的区域设置。尝试在两台电脑上运行这行代码,看看是否会有不同的输出:(ideone)

System.Console.WriteLine(CultureInfo.CurrentCulture);

输出(示例):

en-US

文化(Culture)指定了许多内容,其中之一是日期分隔符。如果您希望所有用户都获得一致的行为,请尝试指定一个文化:(ideone)

CultureInfo cultureInfo = CultureInfo.InvariantCulture; // or whatever you prefer
DateTime dateTime = DateTime.ParseExact("13/05/2012", "dd/MM/yyyy", cultureInfo);

以上代码假定您已经使用了以下语句:

using System;
using System.Globalization;

4
“mm”表示分钟,不是月份,“MM”才是您要寻找的。正如您的例子所示。 - Guvante

11

要小心,在自定义日期和时间格式字符串中,mm指定符代表“分钟”,而不是“月份”。你需要使用MM来表示月份。

DateTime.ParseExact("13/05/2012", "dd/MM/yyyy",  CultureInfo.InvariantCulture)

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