我从字符串解析日期时间时遇到问题 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版本中的两个变量解析完全相同的代码。
解析的最佳方法是什么,错误的原因是什么?
答案 0 :(得分:5)
DateTime.Parse
默认使用CurrentCulture
设置。
这意味着,您的CurrentCulture
有yyyy-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);
}
由于您来自土耳其,我认为您的CurrentCulture
是tr-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-dd
是tr-TR
文化的标准日期和时间格式,而不是dd-MM-yyyy
或MM-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);