奇怪的日期时间解析错误

时间:2014-12-17 07:30:30

标签: c# string datetime

我从字符串解析日期时间时遇到问题 Here DOT 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版本中的两个变量解析完全相同的代码。

解析的最佳方法是什么,错误的原因是什么?

2 个答案:

答案 0 :(得分: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格式。

答案 1 :(得分: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);