奇怪的日期时间解析错误

3

我在解析字符串中的日期时间方面遇到了问题。这里是.NET FIDDLE,以下是我的解析代码:

var DateOfBirth2 = DateTime.Parse(string.Format("{0}-{1}-{2}", "1924", "10", "19"));        
Console.WriteLine(DateOfBirth2);
var DateOfBirth = DateTime.Parse(string.Format("{0}-{1}-{2}", "19", "10", "1924"));
Console.WriteLine(DateOfBirth);

问题在于DateofBirth2可以成功解析,但DateofBirth无法解析并抛出字符串异常。

System.FormatException: 字符串未被识别为有效的 DateTime。

问题是相同的代码可以在不同的 Visual Studio 版本中解析这两个变量。如何最好地解析,错误的原因是什么?

你的 CurrentCulture 是什么? - Soner Gönül
它在我的电脑上可以运行,但很可能是你的“CultureInfo”的问题。 - Dion V.
我接受了Soners的答案,谢谢你的帮助。 - Mehmet Eren Yener
2个回答

5

DateTime.Parse 默认使用 CurrentCulture 设置。

这意味着,您的 CurrentCultureyyyy-MM-dd 作为标准日期和时间格式,但它没有 dd-MM-yyyy 格式。

在这种情况下,您可以使用 DateTime.TryParseExact 进行自定义日期和时间解析,例如;

string s = "19-10-1924";
DateTime dt;
if(DateTime.TryParseExact(s, "dd-MM-yyyy", CultureInfo.GetCultureInfo("tr-TR"),
                          DateTimeStyles.None, out dt))
{
    Console.WriteLine(dt);
}

由于你来自土耳其,我假定你的 CurrentCulturetr-TR(和我一样),你可以找到你文化中所有标准的日期和时间格式,例如:

foreach(var format in CultureInfo.GetCultureInfo("tr-TR").DateTimeFormat.
                      GetAllDateTimePatterns())
{
    Console.WriteLine(format);
}

输出结果将为:

dd.MM.yyyy
dd.MM.yy
yyyy-MM-dd
dd MMMM yyyy dddd
dd MMMM yyyy
dd MMMM yyyy dddd HH:mm
dd MMMM yyyy HH:mm
dd MMMM yyyy dddd HH:mm:ss
dd MMMM yyyy HH:mm:ss
dd.MM.yyyy HH:mm
dd.MM.yy HH:mm
yyyy-MM-dd HH:mm
dd.MM.yyyy HH:mm:ss
dd.MM.yy HH:mm:ss
yyyy-MM-dd HH:mm:ss
dd MMMM
dd MMMM
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
yyyy'-'MM'-'dd'T'HH':'mm':'ss
HH:mm
HH:mm:ss
yyyy'-'MM'-'dd HH':'mm':'ss'Z'
dd MMMM yyyy dddd HH:mm:ss
dd MMMM yyyy HH:mm:ss
MMMM yyyy
MMMM yyyy

正如您从输出中看到的,yyyy-MM-ddtr-TR 文化中的标准日期和时间格式,而不是 dd-MM-yyyyMM-dd-yyyy 格式。

在使用CurrentCulture解析来自外部的数据时要小心。用户可能会覆盖其CurrentCulture设置并破坏您的代码。 - DrKoch
1
@DrKoch 是的,这就是为什么我使用了 CultureInfo.GetCultureInfo("tr-TR") 而不是 CulfureInfo.CurrentCulture,即使我对此非常确定。 - Soner Gönül

1

如果要解析特定日期格式的字符串,不应该依赖于DateTime.Parse()使用的默认格式,因为它会随着当前文化、UI文化等而改变。用户甚至可以覆盖当前文化,使您的代码不可靠。

应该像这样使用DateTime.ParseExact(s, format, provider):

string s1 = string.Format("{0}-{1}-{2}", "1924", "10", "19");
string s2 = string.Format("{0}-{1}-{2}", "19", "10", "1924");

DateTime dateOfBirth1 = DateTime.ParseExact("yyyy-MM-dd", s1, CultureInfo.InvariantCulture);
DateTime dateOfBirth2 =  DateTime.ParseExact("dd-MM-yyyy", s2, CultureInfo.InvariantCulture);

公历中没有19这个月份。 - Soner Gönül

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