【问题标题】:Parse DateTime from string c#从字符串 c# 中解析 DateTime
【发布时间】:2019-03-06 14:11:24
【问题描述】:

我有从传入 API 调用获得的日期:Wed, 6 Mar 2019 14:39:49 +0300

我需要将此字符串解析为 DateTime。为此,我使用以下代码:

DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                     new string[] { "ddd, dd MMM yyyy HH:mm:ss zzzz" },
                     CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

但结果我有错误:

字符串 'Wed, 6 Mar 2019 14:39:49 +0300' 未被识别为有效 日期时间。

我做错了什么?我该如何解决这个问题?

【问题讨论】:

  • 似乎问题在于单个数字 (6) 与 dd 模式不匹配。 “06”应该可以工作
  • 'Long date format' 不适合 API,最好使用 ISO8601 格式,这与语言无关。如果您的代码在非英语语言环境中运行,那么它将无法正确解析。如果您对 API 有任何控制权,我建议您修复它。
  • 仅供参考:与您的问题没有直接关系,但如果您只想使用/提供单个日期格式字符串,则不需要使用字符串数组...

标签: c# datetime


【解决方案1】:

我看到了两件事;

  1. 您应该使用d specifier 而不是dd 说明符,因为您的一位数字日期没有leading zero
  2. 没有zzzz 作为自定义格式说明符。您应该改用zzz specifier

DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                     new string[] { "ddd, d MMM yyyy HH:mm:ss zzz" },
                     CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

但老实说,如果您的字符串具有 UTC Offset 值,我建议将其解析为 DateTimeOffset,因为 DateTime 实例没有偏移部分,并且不推荐使用 zzz 说明符,如 MSDN 所述.

对于DateTime 值,“zzz”自定义格式说明符表示 本地操作系统时区与 UTC 的有符号偏移量, 以小时和分钟为单位。不能反映一个人的价值 实例的DateTime.Kind 属性。 因此,“zzz”格式 不建议将说明符与 DateTime 值一起使用。

解析DateTimeOffset

DateTimeOffset.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                           new string[] { "ddd, d MMM yyyy HH:mm:ss zzz" },
                           CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

现在您可以根据需要分别使用.DateTime 和/或.Offset 属性。

【讨论】:

  • 当一天有 2 位数时这将失败
  • @haim770,你为什么会这样想?你测试过吗?
  • @haim770 我不这么认为,因为d specifier 接受从131 的值,并且一位数的日期没有前导零。
  • 对不起。我的错误
  • @A.Gladkiy 它失败了,因为您需要确保您的 ddd(工作日)与日期匹配
【解决方案2】:

d MMM yyyy 而不是 ddd MMM yyyy

date = DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", "ddd, d MMM yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

【讨论】:

    【解决方案3】:

    Datetime.ParseExact 函数就像下面的代码一样可以帮助你。需要更改的一件事是使用 d MMM yyyy 代替 dd MMM yyyy。

    DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", "ddd, d MMM yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
    

    【讨论】:

      【解决方案4】:

      将“ddd, dd MMM yyyy HH:mm:ss zzzz”改为“ddd,d MMM yyyy HH:mm:ss zzzz”

      DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                           new string[] { "ddd, d MMM yyyy HH:mm:ss zzzz" },
                           CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
      

      【讨论】:

        【解决方案5】:

        你可能正在寻找

        DateTime myDate = DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300",
                                              "ddd, d MMM yyyy HH:mm:ss zzz",
                                              CultureInfo.InvariantCulture, 
                                              DateTimeStyles.AdjustToUniversal);
        

        请参考:https://stackoverflow.com/a/10426999/4373895 这也会对您有所帮助。谢谢。

        【讨论】:

          【解决方案6】:

          UTC 偏移量的格式是 zzz 而不是 zzzz,并希望它有一个冒号 (:) 来分隔小时和分钟(例如 +03:00)。以及 dd 用于每月的前零日,但您在月份中只有一个数字。在这种情况下使用d

          【讨论】:

          • 很遗憾,它没有帮助,我无法添加冒号 (:),因为它是第三方服务。
          • @A.Gladkiy 你可以对字符串做一些预处理。
          • @DanielA.White 实际上zzz 说明符可以 解析没有:。来自维基百科:“它通常以±[hh]:[mm]±[hh][mm]±[hh] 的格式显示。”据我所知,那个冒号不是强制性的。
          【解决方案7】:
          DateTime time = Convert.ToDateTime("Wed, 6 Mar 2019 14:39:49 +0300");
          string ti = time.ToString(@"ddd, dd MMM yyyy HH:mm:ss zzzz");
          

          【讨论】:

            猜你喜欢
            • 2011-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-18
            • 1970-01-01
            • 1970-01-01
            • 2013-04-04
            相关资源
            最近更新 更多