C#:如何将字符串转换为DateTime,其中字符串可以具有任何标准日期时间格式

我在DateTime上发布了一个关于String转换的问题,我得到了很多令人满意的答案..所以我非常感谢StackOverflow ..
这是String manupulation的另一个问题,我被困在..

我必须使用C#代码转换字符串(来自某些外部源)..字符串可以具有这些预期的DateTime格式。

  1. 02/31/2009 01:59:59 24小时格式
  2. 02/31/2009 01:59:59 AM 12小时格式
  3. 2/31/2009 1:59:59
  4. 2/31/2009 1:59:59 AM
  5. 02/01/2009 01:59:59 AM
  6. 2/1/2009 1:59:59
  7. 等等 …….

我尝试使用DateTime(Convert.ToInt32(string_date.Substring(6,4)),Int,Int,Int,Int,Int,Int)
即,通过提取月,日等的值

但它不起作用..因为我不能完美地用子串提取值…因为字符串的长度是变化的
我也试图提取“/”,“ 空间 ”和“:”的出现值,但它变成瓶颈,导出(非)发生AM / PM

只有日,月和小时的长度可以变化..

您可以使用DateTime.ParseExact重载,该重载采用以下格式列表:

 private static string[] formats = new string[] { "MM/dd/yyyy HH:mm:ss tt", "MM/dd/yyyy HH:mm:ss", "M/dd/yyyy H:mm:ss tt", "M/dd/yyyy H:mm:ss" }; private static DateTime ParseDate(string input) { return DateTime.ParseExact(input, formats, CultureInfo.InvariantCulture, DateTimeStyles.None); } 

如果传递的字符串与任何给定格式不匹配,则抛出FormatException 。 请注意,期望AM / PM的格式应出现在没有AM / PM的相同格式之前( "MM/dd/yyyy HH:mm:ss tt"出现在"MM/dd/yyyy HH:mm:ss" )。

更新
正如Henk在评论中指出的那样,当使用TryParseExact删除exception情况时,可以使用相同的function。 此外,与可空类型配对,这可以更清洁:

 private static DateTime? ParseDate(string input) { DateTime result; if (DateTime.TryParseExact(input, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) { return result; } return null; } 

现在,如果它无法解析输入,它将只返回一个空引用。

看一下TryParseExact方法。 这是第一个案例的例子:

 DateTime date; // I changed 02/31/2009 to 01/31/2009 because the first is not a valid date if (DateTime.TryParseExact("01/31/2009 01:59:59", "MM/dd/yyyy HH:mm:ss", null, DateTimeStyles.None, out date)) { // string successfully parsed => do something with the date } 

然后,您可以保留不同格式的列表,并尝试使用所有格式解析字符串,直到成功为止。

以下是所有可能的格式..

  1. MM / dd / yyyy 08/22/2006
  2. dddd,dd MMMM yyyy 2006年8月22日星期二
  3. dddd,dd MMMM yyyy HH:mm星期二,2006年8月22日06:30
  4. dddd,dd MMMM yyyy hh:mm tt星期二,2006年8月22日06:30 AM
  5. dddd,dd MMMM yyyy H:mm星期二,2006年8月22日6:30
  6. dddd,dd MMMM yyyy h:mm tt星期二,2006年8月22日上午6:30
  7. dddd,dd MMMM yyyy HH:mm:ss星期二,2006年8月22日06:30:07
  8. MM / dd / yyyy HH:mm 08/22/2006 06:30
  9. MM / dd / yyyy hh:mm tt 08/22/2006 06:30 AM
  10. MM / dd / yyyy H:mm 08/22/2006 6:30
  11. MM / dd / yyyy HH:mm:ss 08/22/2006 06:30:07
  12. MMMM dd 8月22日
  13. yyyy’ – ‘MM’ – ‘dd’T’HH’:’mm’:’ss.fffffffK 2006-08-22T06:30:07.7199222-04:00
  14. ddd,dd MMM yyyy HH’:​​’mm’:’ss’GMT’Tue,2006年8月22日06:30:07 GMT
  15. yyyy’ – ‘MM’ – ‘dd’T’HH’:’mm’:’ss 2006-08-22T06:30:07
  16. HH:mm 06:30
  17. hh:mm tt 06:30 AM
  18. H:mm 6:30
  19. h:mm tt 6:30 AM
  20. HH:mm:ss 06:30:07
  21. yyyy’ – ‘MM’ – ‘dd HH’:​​’mm’:’ss’Z’2006-08-22 06:30:07Z
  22. dddd,dd MMMM yyyy HH:mm:ss星期二,2006年8月22日06:30:07
  23. yyyy MMMM 2006年8月

DateTime dt1 = DateTime.ParseExact(“2007/01/01 04:23:12”,“yyyy / MM / dd hh:mm:ss”,System.Globalization.CultureInfo.CurrentCulture);

DateTime dt = Convert.ToDateTime(“2007/01/01 04:23:12”,System.Globalization.CultureInfo.CurrentCulture);

System.Globalization.CultureInfo.CurrentCulture格式参数