【问题标题】:When is empty string "" a valid DateTime string format?空字符串“”何时是有效的 DateTime 字符串格式?
【发布时间】:2018-03-20 13:24:45
【问题描述】:

看到一个奇怪的问题,在某些系统上,下面的代码进入 if 语句(即它返回 true),而在其他系统中它返回 false 并进入 else 语句。我错过了哪些环境条件或框架版本更改?例如 .net Fiddle 返回 true,但我自己的控制台应用程序返回 false。

    DateTime time;
    formatText = "";
    if (DateTime.TryParse (DateTime.Now.ToString(formatText), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out time))
    {
        // If TryParseExact Worked
        Console.WriteLine ("True: " + time.ToString ()); 
    }
    else
    {
        // If TryParseExact Failed
        Console.WriteLine ("Failed to Parse Date");
    } 

【问题讨论】:

  • "如果格式为 null 或空字符串,则使用通用格式说明符 'G'。"当前区域性的G 格式不需要匹配不变区域性接受的任何格式。如果您想要一致的结果,也可以在 .ToString 中指定 CultureInfo.InvariantCulture。
  • "// If TryParseExact Worked" 但不是TryParseExact,是TryParse...
  • 如果你想知道它到底在哪些文化上失败了 - 遍历CultureInfo.GetCultures(CultureTypes.AllCultures)并使用DateTime.Now.ToString(formatText, culture)为每个文化执行你的代码。
  • .Net Fiddle 显示 G 的区域性 toString 输出以及它们是否通过了您的测试。

标签: c# .net parsing datetime datetime-format


【解决方案1】:

DateTime 的字符串表示是特定于文化的。

传递一个空字符串或null 作为DateTime 的ToString 重载的format 参数与传递standard format specifier "G" 相同——来自DateTime.ToString Method (String) msdn 页面的备注部分:

如果 format 为 null 或空字符串,则使用通用格式说明符“G”。

您正在使用的TryParse 重载尝试使用IFormatProvider 格式参数中可用的日期和时间格式解析DateTime 值 - 在您的情况下为InvariantCulture - 所以当您将TryParse 与@ 一起使用时987654334@,除非您当前区域性的ShortDatePattern 和LongTimePattern 属性与InvariantCulture 中的相同,否则tryParse 将失败。

【讨论】:

    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2021-03-30
    • 1970-01-01
    • 2016-08-28
    相关资源
    最近更新 更多