将任何日期格式的字符串解析为日期时间

10
在C#中,我怎样才能解析格式为"dd/mm/yyyy"或者"dd-mm-yyyy"的字符串到日期时间类型? 我得到一个错误提示说我的字符串格式不正确。我需要能够解析所有的格式,而不仅仅是其中一个。

6
“我需要能够解析所有格式” - 鉴于存在“dd/mm/yyyy”和“mm/dd/yyyy”两种格式,月份中12日或之前的日期必须具有歧义性 - 这是计算机无法解决的问题。 - Damien_The_Unbeliever
2
你试图解析哪些格式? - Corak
@Teejay - 是的,这就是为什么"yyyy-MM-dd"应该是每个人永远使用的唯一格式。嗯,至少在9999年之前是这样... - Corak
1
@Corak,因为我来自意大利,我认为dd/MM/yyyy也非常好。绝对的,MM/dd/yyyy是最没有意义和混淆人的。 - Teejay
2
@Teejay - 我在德国,我们使用的日期格式是dd.MM.yyyy。但是当加上时间时,这种格式也很快变得“错误”。"dd.MM.yyyy HH:mm:ss"? 这是什么鬼?因此:"yyyy-MM-dd HH:mm:ss" => 逻辑!^_^ - Corak
显示剩余5条评论
4个回答

15
你可以定义喜欢的任何格式 - 另外,你还可以获取给定文化的默认列表。
var ci = new CultureInfo("en-US");
var formats = new[] { "M-d-yyyy", "dd-MM-yyyy", "MM-dd-yyyy", "M.d.yyyy", "dd.MM.yyyy", "MM.dd.yyyy" }
        .Union(ci.DateTimeFormat.GetAllDateTimePatterns()).ToArray();

DateTime.ParseExact("07/23/2013", formats, ci, DateTimeStyles.AssumeLocal).Dump();
DateTime.ParseExact("07-23-2013", formats, ci, DateTimeStyles.AssumeLocal).Dump();
DateTime.ParseExact("23-07-2013", formats, ci, DateTimeStyles.AssumeLocal).Dump();
DateTime.ParseExact("23.07.2013", formats, ci, DateTimeStyles.AssumeLocal).Dump();

输出:

7/23/2013 12:00:00 AM
7/23/2013 12:00:00 AM
7/23/2013 12:00:00 AM
7/23/2013 12:00:00 AM

8

mm 表示分钟,大写的 MM 表示月份。

除此之外,如果你想解析带有 / 作为日期分隔符的字符串,你必须使用 CultureInfo.InvariantCulture,因为这是替换当前文化日期分隔符的字符:

所以这样可以正常工作:

DateTime.ParseExact("23/07/2013", "dd/MM/yyyy", CultureInfo.InvariantCulture);

请参见:"/"自定义格式规范符号

5

您需要定义要接受的日期格式。并不是所有日期格式都可以使用。一旦确定了日期格式,您就可以将格式数组传递给DateTime.ParseExact

您的代码可能如下所示:

string[] formats = new string[2] {"dd/MM/yyyy", "dd-MM-yyyy"};

string date = "23-02-2013";
try
{
    DateTime result = DateTime.ParseExact(date, formats, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
}
catch (FormatException)
{ 
    // your error handling code here
}

1
你可以使用DateTime.ParseExact方法并指定格式。
    var d = DateTime.ParseExact(token, "dd-MM-yyyy", 
            CultureInfo.InvariantCulture, 
            DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal);

你的格式字符串有误。mm 代表分钟,不是月份。 - John Koerner
@JohnKoerner 谢谢你发现了这个问题。 - doogle

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