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

Inf*_*nd' 7 c# string 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)
ie,通过提取月,日等的值

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

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

Fre*_*örk 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);
}
Run Code Online (Sandbox Code Playgroud)

FormatException如果传递的字符串与任何给定格式都不匹配,则抛出a .请注意,期望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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • TryParseExact也存在这种重载,没有理由让它出现异常. (4认同)

Dar*_*rov 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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 有没有其他有效的方式..?我的意思是,输入那么多线条很麻烦,因为我有很多线路可供选择. (2认同)