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

时间:2009-12-11 07:38:54

标签: c# datetime string

我在DateTime上发布了一个关于字符串转换的问题,我得到了很多令人满意的答案..所以我非常感谢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. 等.......
  8. 我尝试使用DateTime(Convert.ToInt32(string_date.Substring(6,4)),Int,Int,Int,Int,Int,Int)
    即,通过提取月份,日等的值

    但是它不起作用..因为我无法完美地提取子字符串的值..因为字符串的长度是变化
    我也尝试提取引用“/”,“的出现的值空间“和”:“但它变成瓶颈,导出(非)发生AM / PM
    只有日,月和小时的长度可以变化。 。

4 个答案:

答案 0 :(得分:23)

您可以使用带有格式列表的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时可以使用相同的功能来删除异常情况。此外,与可空类型配对,可以使它更清洁:

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

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

答案 1 :(得分:7)

查看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
}

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

答案 2 :(得分:2)

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

  
      
  1. MM / dd / yyyy 08/22/2006
  2.   
  3. dddd,dd MMMM yyyy 22日周二   2006年8月
  4.   
  5. dddd,dd MMMM yyyy HH:mm星期二,   2006年8月22日06:30
  6.   
  7. dddd,dd MMMM yyyy hh:mm tt   2006年8月22日星期二上午06:30
  8.   
  9. dddd,dd MMMM yyyy H:mm星期二,22   2006年8月6:30
  10.   
  11. dddd,dd MMMM yyyy h:mm tt Tuesday,   2006年8月22日上午6:30
  12.   
  13. dddd,dd MMMM yyyy HH:mm:ss    2006年8月22日星期二06:30:07
  14.   
  15. MM / dd / yyyy HH:mm 08/22/2006 06:30
  16.   
  17. MM / dd / yyyy hh:mm tt 08/22/2006   06:30 AM
  18.   
  19. MM / dd / yyyy H:mm 08/22/2006 6:30
  20.   
  21. MM / dd / yyyy HH:mm:ss 08/22/2006    6点30分07秒
  22.   
  23. MMMM dd 8月22日
  24.   
  25. YYYY ' - ' MM ' - ' dd'T'HH ':' 毫米 ':' ss.fffffffK     2006-08-22T06:30:07.7199222-04:00
  26.   
  27. ddd,dd MMM yyyy HH':​​'mm':'ss'GMT'     2006年8月22日星期二06:30:07 GMT
  28.   
  29. YYYY ' - ' MM ' - ' dd'T'HH ':' 毫米 ':' SS     2006-08-22T06:30:07
  30.   
  31. HH:mm 06:30
  32.   
  33. hh:mm tt 06:30 AM
  34.   
  35. H:mm 6:30
  36.   
  37. h:mm tt 6:30 AM
  38.   
  39. HH:mm:ss 06:30:07
  40.   
  41. yyyy' - 'MM' - 'dd HH':​​'mm':'ss'Z'     2006-08-22 06:30:07Z
  42.   
  43. dddd,dd MMMM yyyy HH:mm:ss     2006年8月22日星期二06:30:07
  44.   
  45. yyyy MMMM 2006年8月
  46.   

答案 3 :(得分:0)

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 格式参数