字符串未被识别为有效的DateTime格式异常

时间:2018-04-27 01:49:45

标签: c# .net datetime datetime-format

我正在尝试使用以下语句进行简单的解析:

//In actual code the date time value comes from db
var dateTime = new DateTime(2018, 04, 26);

var dtExtact = DateTime.ParseExact(dateTime.ToString(), "dd MMM yyyy HH:mm:ss:fff",null);

现在当我尝试这样做时会出现错误,

  

System.FormatException:'字符串未被识别为有效的DateTime。'

我确实查看过MSDN示例,但它没有提供有关我的约会时间错误的任何指示。

2 个答案:

答案 0 :(得分:4)

如果要以特定格式解析日期时间字符串,请确保格式化的日期/时间字符串与解析器的格式匹配。

在您的示例“round-tripping”中,通过重复使用相同的格式字符串格式化日期和进行解析,可以轻松实现日期/时间:

var dateTime = new DateTime(2018, 04, 26);
const string dateFormat = "dd MMM yyyy HH:mm:ss:fff";
var dtExact = DateTime.ParseExact(
    dateTime.ToString(dateFormat)
,   dateFormat
,   null
);
Console.WriteLine("{0} {1}", dateTime, dtExact);

Demo.

答案 1 :(得分:1)

ToString()和Parse()都设计为从Windows自动提取Region设置。覆盖此行为绝不是一个好主意。显然你的模式不是一个有效的模式。据我们所知,':'实际上并不是时间元素的适当文化分隔符

总的来说,这似乎相当可疑 - 你将DateTime转换为字符串,只是在那里再次解析它。我只能猜测它是用于测试的。但是测试问题是什么。

在处理DateTimes时我有3条一般规则:

  • 始终存储,检索和传输UTC值。您不希望在问题中添加时区。 That way lies madness。有一些罕见的例外情况,但是你几乎可以自己处理这个混乱
  • 避免以文本形式存储,检索或传输。尽可能长时间保持适当的数据类型
  • 如果您可以遵循第二条规则(使用XML或其他一些序列),至少在所有端点选择一个固定的文化格式,格式字符串和字符串编码。您不希望将这些问题添加到您的后顾之忧

遵循这些规则,我很少遇到任何问题。