繁体   English   中英

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

[英]Failing to parse date in yyyyMMdd Hmm format using DateTime.TryParseExact()

我正在以“ 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

请帮我解决一下这个。

我没有完全感到惊讶的是它未能解析-我怀疑它是在贪婪地解析“ 63”并将其视为无效的小时数。

在Noda Time中,我们有完全相同的问题 -我无意修复。 使这项工作将是一个巨大的努力量,很可能减少对更为明智格式的效果。

我强烈建议您改用更明智的格式,例如

  • H:mm消除伪歧义
  • HHmm ,让一切变得更清晰
  • IMO, HH:mm甚至更好-最好在日期部分加上连字符,因此yyyy-MM-dd HH:mm

您只需检测字符串的长度即可将其从一种格式转换为另一种格式,因为字符串的其他每个部分都是固定长度。 例如,仅使用HHmm您可以执行以下操作:

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

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

//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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM