【问题标题】:String was not recognized as a valid DateTime format exception字符串未被识别为有效的 DateTime 格式异常
【发布时间】:2018-04-27 01:49:45
【问题描述】:

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

//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: '字符串未被识别为有效的日期时间。'

我确实查看了MSDN 示例,但它没有提供任何关于我的日期时间有什么问题的指示。

【问题讨论】:

  • 因为dateTime.ToString() 可能不会生成格式为“dd MMM yyyy HH:mm:ss:fff”的字符串。
  • MMM 似乎数字太多无法解析。
  • @RobertSim MMM 代表(“Jan”、“Feb”等)或基于 CultureInfo 的等价物。
  • 我不禁想知道你为什么要这样做。这些值真的以字符串的形式从数据库中出来吗?

标签: c# .net datetime datetime-format


【解决方案1】:

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

在您的示例“往返”中,通过重用相同的格式字符串来格式化日期和进行解析,很容易实现日期/时间:

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.

【讨论】:

  • 显然,只有当两个部分在同一台(或类似配置的)机器上运行时,这种往返才有效。如果您需要往返涉及将数据发送到进程外的值 - 使用"O" as format
【解决方案2】:

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

总体而言,这似乎相当可疑 - 您将 DateTime 转换为字符串,只是在那里再次解析它。我只能猜测它是为了测试。但是测试问题是什么。

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

  • 始终存储、检索和传输 UTC 值。您不想在问题中添加时区。 That way lies madness。有极少数例外,但您几乎可以靠自己来处理这个烂摊子
  • 避免以文本形式存储、检索或传输。尽可能将其保存在适当的 DataTypes 中
  • 如果您可以遵循第二条规则(使用 XML 或其他序列化),至少在所有端点选择一个固定的文化格式、格式字符串和字符串编码。您不想将这些问题添加到您的担忧中

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2011-01-12
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多