无法使用DateTime.TryParseExact()以yyyyMMdd Hmm格式解析日期

时间:2017-03-17 14:22:44

标签: c# type-conversion

我的日期时间是" 20170317 630" 这意味着2017年3月17日上午6:30

这是我正在尝试的代码块,但它失败了。

var str = "20170317 0630";
var formatedTime = "yyyyMMdd Hmm";
DateTime etaDate;
if (!DateTime.TryParseExact(str,formatedTime, CultureInfo.InvariantCulture, DateTimeStyles.None, out etaDate))  //formatedTime, CultureInfo.InvariantCulture, DateTimeStyles.None
{
    Console.WriteLine("Date conversion failed " +  etaDate);
}

Console.WriteLine("Date conversion passed "+etaDate);

传递:20170317 0630

失败:20170317 630

请帮助我。

3 个答案:

答案 0 :(得分:4)

我并不完全惊讶它没有解析它 - 我怀疑它贪婪地解析了" 63"并认为这是一个无效的小时数。

我们有exactly the same problem in Noda Time - 我并不打算修复它。完成这项工作将是一项巨大的努力,并且很可能会降低更合理的格式的性能。

我强烈建议采用更合理的格式,例如:

之一
  • H:mm删除伪歧义
  • HHmm让一切更加清晰
  • HH:mm甚至更好,IMO - 最好使用连字符作为日期部分,所以yyyy-MM-dd HH:mm

您可以通过简单地检测字符串的长度从一种格式转换为另一种格式,因为它的每个其他部分都是固定长度。例如,要转到使用HHmm,您可以执行以下操作:

if (str.Length == "yyyyMMdd Hmm".Length)
{
    str = str.Insert("yyyyMMdd ".Length, "0");
}

然后使用yyyyMMdd HHmm格式进行解析。如果 有效宽度的长度不正确,那么无论如何都无法解析。

答案 1 :(得分:0)

//split str in to strDate and strTime by using space
    var strDate = "20170317"; //Date part
    var strTime ="630";       //Time part
    if(strTime.Length ==3)   //check lenght of time part
    {
         strTime = "0" + strTime;  //Add extra zero
    }
    var formatedTime = "yyyyMMdd HHmm";
    DateTime etaDate;
    if (!DateTime.TryParseExact(strDate + strTime,formatedTime, CultureInfo.InvariantCulture, DateTimeStyles.None, out etaDate))  //formatedTime, CultureInfo.InvariantCulture, DateTimeStyles.None
    {
        Console.WriteLine("Date conversion failed " +  etaDate);
    }

    Console.WriteLine("Date conversion passed "+etaDate);

答案 2 :(得分:-2)

尝试:

var str = "20170317 0630";
    var formatedTime = "yyyyMMdd HHmm";
    DateTime etaDate;
    if (!DateTime.TryParseExact(str,formatedTime, CultureInfo.InvariantCulture, DateTimeStyles.None, out etaDate))  //formatedTime, CultureInfo.InvariantCulture, DateTimeStyles.None
    {
        Console.WriteLine("Date conversion failed " +  etaDate);
    }

    Console.WriteLine("Date conversion passed "+etaDate);