日期时间 ParseExact 抛出异常

3

我正在尝试解析这个日期

2013年5月10日 00:27:04

        var stt = "5/10/2013 002704";
        result = DateTime.ParseExact(stt, "dd-MM-yyyy HHmmss", CultureInfo.InvariantCulture);

但是我遇到了这个异常

字符串无法识别为有效的日期时间。

然而! 这段代码可以解析仅包含时间而不包括日期的*时间*

        var stt = "002704";
        result = DateTime.ParseExact(stt, "HHmmss", CultureInfo.InvariantCulture);

希望有人能帮我解决这个问题,提前表示感谢...
提示:这也失败了。
    var stt = "5/10/2013 002704";
    result = DateTime.ParseExact(stt, "dd/MM/yyyy HHmmss", CultureInfo.InvariantCulture);

好的,它起作用了!感谢每个人在这里给予我的非常好的帮助,我非常感激。下次我会考虑到XY问题:D。


2
你在样本数据中使用“/”来分隔日期,然后在解析时检查“-”。 - Jim D'Angelo
2
您的数字不够,请使用“d/M/yyyy HHmmss”。 - Hans Passant
@HansPassant:如果程序是在2013年10月10日启动的,如果我改为d/M/yyyy,它将抛出相同的异常。 - Roman Ratskey
1
简短的回答是,如果你要使用ParseExact(),你最好确定提供的字符串与格式说明符匹配。否则,考虑使用DateTime.Parse()。这个问题背后的真正用例是什么?这可能更有建设性。 - Dan J
1
@RuneS 它可以工作,你自己试试看。 - Scott Chamberlain
显示剩余3条评论
4个回答

5
啊,你正在使用dd进行精确解析,但是传入的是d。将输入字符串更改为"05/10/2013 002704",并确保在分隔符中使用/
var stt = "05/10/2013 002704";
result = DateTime.ParseExact(stt, "dd/MM/yyyy HHmmss", CultureInfo.InvariantCulture);

编辑

抱歉,我接了一个电话,无法完成我的思路。您可能不想使用dd,而是要使用d。它将与05/10/2013或任何小于等于31的数字一起使用(如问题评论中指出的)。此外,我认为@DanJ就该方法的用例发表了很好的评论。

简而言之,如果你要使用Parse*Exact*()函数,你最好确定提供的字符串与格式说明符匹配。

如果您要继续使用ParseExact函数,则应使用:

result = DateTime.ParseExact(stt, "d/MM/yyyy HHmmss", CultureInfo.InvariantCulture);

你需要的是 d 而不是 dd - Scott Chamberlain
还有一个小问题,我该如何以M/D/YYYY的格式获取日期,而不是D/M/YYYY? - Roman Ratskey
1
@RuneS 你应该提出另一个问题,不过我不建议仅仅问如何格式化日期为M/D/YYYY,而是告诉我们你想做什么。你可能在以一种困难的方式进行操作,而可能有一个更简单的解决方案来达到你想要的目标。请阅读关于什么是XY问题的内容(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem),告诉我们X(我猜是与日期操作相关的某些事情)而不是询问Y(解析和格式化日期为字符串)。 - Scott Chamberlain
@ScottChamberlain:好的,现在它正常工作了,下次我会考虑你的建议,非常感谢大家的帮助,我真的非常感激。 - Roman Ratskey
在回答问题时,我匆忙行事,像一个美国人一样只读了日期并写出了“MM”。应该参考“dd”而不是“MM”。我已经更新了我的答案以反映修复。 - Jim D'Angelo
显示剩余2条评论

3

你有两个错误:

  1. 你正在使用dd表示月份中的日期,如果日期是一位数,它预期会有一个前导的0。请改用d
  2. 正如其他人所说,你在格式化字符串中使用了-,但在输入数据中使用了/

如何使其接受dd和d两种格式 - Roman Ratskey
d将接受505 - adrianbanks

2
首先,您正在使用包含-(dd-MM-yyyy)的格式字符串进行解析,而字符串包含/(5/10/2013)。
另一件事是日期组件应该是d,而不是dd,因为它是5而不是05
  var stt = "5/10/2013 002704";
    result = DateTime.ParseExact(stt, "d/MM/yyyy HHmmss", CultureInfo.InvariantCulture);

它失败了,你自己试试看。 - Roman Ratskey
@RuneS更新了答案,请现在检查。 - Akram Berkawy
但是如果日期是10/10/2013呢...因为我没有使用静态日期,它应该随着程序执行的时间而改变。 - Roman Ratskey
d 适用于数字 131,dd 适用于 0131 - Scott Chamberlain
d将接受05和5两种形式。 - Akram Berkawy

2
为什么要争论“d”和“dd”,或者“M”和“MM”呢?
你可以拥有并使用它们所有!它们都是有效的,所以把它们都当作有效的。创建一个允许格式的数组,并将其传递给DateTime.TryParseExact()。现在,所有这些情况都将像您期望的那样处理。
        DateTime result;
        var stt = "5/10/2013 002704";
        string[] formats = { "d/M/yyyy HHmmss", "dd/MM/yyyy HHmmss", "d/MM/yyyy HHmmss", "dd/M/yyyy HHmmss" };
        if (DateTime.TryParseExact(stt, formats, null, System.Globalization.DateTimeStyles.None, out result))
        {
            // ... do something with "result" in here ...
            Console.WriteLine(result.ToString());
        }
        else
        {
            // ... parse failed ...
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接