C# 特定格式C的日期时间值解析#

C# 特定格式C的日期时间值解析#,c#,parsing,datetime,C#,Parsing,Datetime,有一个字符串2020-12-27 20:00:00。应用程序必须将其解析为DateTime结构。预期格式为yyyy-MM-dd hh:MM:ss。 我使用: 但它不起作用。TryParseExact返回false。 有人知道为什么吗?您需要使用HH而不是HH说明符 表示格式(00至23),但表示格式(01至12) hh是12小时格式,您应该使用hh24小时 因此,您的示例变成: DateTime.TryParseExact(timeString, "yyyy-MM-dd HH:mm:ss",

有一个字符串
2020-12-27 20:00:00
。应用程序必须将其解析为DateTime结构。预期格式为
yyyy-MM-dd hh:MM:ss
。 我使用:

但它不起作用。TryParseExact返回false。
有人知道为什么吗?

您需要使用
HH
而不是
HH
说明符

表示格式(
00
23
),但表示格式(
01
12


hh
是12小时格式,您应该使用
hh
24小时

因此,您的示例变成:

DateTime.TryParseExact(timeString, "yyyy-MM-dd HH:mm:ss", 
                       CultureInfo.InvariantCulture, DateTimeStyles.None, out time)

您可以使用我编写的方法从任何格式的字符串转换DTs:

public static DateTime? parseDate(this string date, string format = @"ddMMyyyy")
{                    
    format += "HHmmss";
    DateTime dt;            
    try 
    {
        string day = date.Substring(format.IndexOf('d'), 2);
        string month = date.Substring(format.IndexOf('M'), 2);
        string year = date.Substring(format.IndexOf('y'), 4);               
        string hour = date.Length - 1 > format.IndexOf('H')? date.Substring(format.IndexOf('H'), 2) : "00";
        string minute = date.Length - 1 > format.IndexOf('m')? date.Substring(format.IndexOf('m'), 2) : "00";
        string second = date.Length - 1 > format.IndexOf('s')? date.Substring(format.IndexOf('s'), 2) : "00";

        dt = DateTime.Parse(year + "/" + month + "/" + day + " " + hour + ":" + minute + ":" + second);
    }
    catch { return null; }
    return dt;
}
用法:

string date = "2014ASDA04QWER05zxc";
DateTime? dt = date.parseDate("yyyyxxxxMMxxxxdd");
结果:2014/04/05 00:00

然而,您是对的,也许您应该使用带有HH的
DateTime.ParseExact
,而不是
HH
,因为我的方法过于复杂

使用20000个随机日期对两种方法进行比较:

哇。。这种方法到底是为了什么?o、 o将字符串拆分为片段通常是将其解析为DateTime的一个坏主意。我在字符串中有3种不同格式的dt,需要将它们转换为可为null的DateTime,因此我创建了自己的扩展方法:)这是非常无用的。代码可能适合您的情况,但它根本不可重用或国际化(提示:
DateTime.Parse()。你知道的?如果垃圾字符位于固定位置,也可以选择清除它们的输入。好吧,这可能不是这种情况下的最佳方法,但它可以工作,并且在性能方面也可以,而且我没有尝试使用tryparse来解析像“2014ASDA04QWER05zxc”这样的日期。可能有效,也可能无效。谢谢!我知道这将是一件糟糕的小事。
public static DateTime? parseDate(this string date, string format = @"ddMMyyyy")
{                    
    format += "HHmmss";
    DateTime dt;            
    try 
    {
        string day = date.Substring(format.IndexOf('d'), 2);
        string month = date.Substring(format.IndexOf('M'), 2);
        string year = date.Substring(format.IndexOf('y'), 4);               
        string hour = date.Length - 1 > format.IndexOf('H')? date.Substring(format.IndexOf('H'), 2) : "00";
        string minute = date.Length - 1 > format.IndexOf('m')? date.Substring(format.IndexOf('m'), 2) : "00";
        string second = date.Length - 1 > format.IndexOf('s')? date.Substring(format.IndexOf('s'), 2) : "00";

        dt = DateTime.Parse(year + "/" + month + "/" + day + " " + hour + ":" + minute + ":" + second);
    }
    catch { return null; }
    return dt;
}
string date = "2014ASDA04QWER05zxc";
DateTime? dt = date.parseDate("yyyyxxxxMMxxxxdd");