【问题标题】:NSDateFormatter dateFromString Always Returns nilNSDateFormatter dateFromString 总是返回 nil
【发布时间】:2013-10-18 11:09:31
【问题描述】:

我想提前道歉,因为我提出了一个重复的问题,但其他解决方案都没有对我有用。每次我尝试将日期字符串传递给 dateFromString 函数时,我都会得到 nil。自 iOS 7 更新以来,我还没有看到任何事情发生了变化,但如果这对这是否仍然以同样的方式工作有影响,我会及时更新。

这是我用来从字符串创建日期的代码:

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
    [dateFormat setLocale:[NSLocale systemLocale]];
    [dateFormat setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
    [dateFormat setFormatterBehavior:NSDateFormatterBehaviorDefault];

    NSDate *date = [[NSDate alloc] init];
    date = [dateFormat dateFromString:dateString];

    return date;

我已根据我为解决此问题而阅读的所有解决方案设置了 dateFormat,但这些设置都没有解决问题。 systemLocale 绝对是为英语设置的,因此不会引起任何问题。

这是我传递给 dateFromString 的 dateString:

Wednesday, October 9, 2013 at 2:40:29 PM Pacific Daylight Time

感谢您的帮助!

【问题讨论】:

  • 你不明白你真正需要在 DateFormat 中输入什么......你输入的内容,dateString 应该是例如:2013-01-04 10:32:01。不像你的样子。

标签: ios nsdate nsdateformatter


【解决方案1】:

如果有人和我一样被困在同一个热闹的边缘案例中:

"2020-03-08T02:00:00" 将返回 nil,只要您处于遵循夏令时的语言环境中,因为该时间已被跳过并且根本不存在。

【讨论】:

    【解决方案2】:

    别忘了转义"yyyy/MM/dd' 'HH:mm:ss"空格符号

    【讨论】:

      【解决方案3】:

      根据NSDateFormatter documentation

      使用固定格式的日期(例如 RFC 3339)时,您可以设置 日期格式 属性来指定格式字符串。

      如果您的日期格式是2017-06-16T17:18:59.082083Z,那么dateFormat 属性应该类似于yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ

      斯威夫特 3

      let dateFormatter = DateFormatter()
      let date = "2017-06-16T17:18:59.082083Z"
      dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"
      
      let result = dateFormatter.date(from: date) // 2017-06-16 17:18:59 +0000
      

      【讨论】:

      • 你是救生员,非常感谢!我使用的是yyyy-MM-dd'T'HH:mm:ss.ZZZZZ 格式,它一直返回null。然后我尝试了你的格式字符串,它工作得很好。我不敢相信使用ss.ZZZZZ 不起作用,但使用ss.SSSSSSZ 确实有效..... :/
      • @Supertecnoboff 我曾经遇到过同样的问题,很高兴它成功了!
      • 有趣的是,这似乎不再起作用。目前(Swift 5.1.3)resultnil 的形式返回。
      【解决方案4】:

      这里有两个问题:

      1. 格式化程序期望的日期字符串格式 (@"yyyy-MM-dd hh:mm:ss") 与您尝试解析的日期字符串格式 (@"EEEE, MMMM d, yyyy 'at' h:mm:ss a zzzz") 不同。

      2. 将格式化程序的语言环境设置为[NSLocale systemLocale] 会导致[dateFormat dateFromString:] 返回nil。将其设置为[NSLocate currentLocale]

      格式化程序的完整代码应该是:

          NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
          [dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
          [dateFormat setLocale:[NSLocale currentLocale]];
          [dateFormat setDateFormat:@"EEEE, MMMM d, yyyy 'at' h:mm:ss a zzzz"];
          [dateFormat setFormatterBehavior:NSDateFormatterBehaviorDefault];
      
          NSDate *date = [dateFormat dateFromString:dateString];
      

      【讨论】:

      • 哇,就是这样!我是 Objective C 中的整个 dateFromString 业务的新手。使用 stringFromDate 更容易,因为它已经知道什么是什么,所以我不必像你在这里所做的那样对格式字符串进行任何匹配。非常感谢您的帮助!
      • @Macros185 不用担心。如果您将来可能需要它,这里是a reference for the date format symbols。另外,如果您愿意单击我的答案旁边零上方的小向上箭头,我将不胜感激:)
      • 我很乐意对此进行投票,但我的代表不允许我对此进行评价。对不起...
      • 嗯,我对此寄予厚望!我的日期字符串是 2016-03-14 13:41:47,我的 dateFormat 是 yyyy-MM-dd hh:mm:ss,我的时区和语言环境已设置,但 dateFromString: 仍然返回 nil。 :(
      • @olie 使用yyyy-MM-dd HH:mm:ss,因为您的时间使用的是 24 小时制。如果您希望凌晨 1 点成为 1:00,请使用 H:mm。如果您希望它为零填充,即 01:00,请使用 HH:mm
      【解决方案5】:

      另一种获得 nil 的方法是,如果您使用 hh 并且您的时间是 24 小时制并且 > 12,在这种情况下,您需要 HH(或 H,用于填充零)。

      即:

      • 格式:yyyy-MM-DD hh:mm:ss,字符串:“2016-03-01 13:42:17”将返回 nil
      • 格式:yyyy-MM-DD HH:mm:ss,字符串:“2016-03-01 13:42:17”将返回您期望的日期。

      为此向@neilco 致敬(请参阅他的答案下方的 cmets)。如果你喜欢这个答案,也请给他投票。

      【讨论】:

      • 给我很好的提示。谢谢!
      • 也为我工作。
      【解决方案6】:

      您正在尝试使用 dateFromString,但您传递给 Formatter 的格式与您在 dateString 中使用的格式不同。

      尝试在你的 dateFormat 中使用这个配置:E',' M d',' yyyy 'at' hh:mm:ss aa z

      【讨论】:

        【解决方案7】:

        您的日期格式与您传递的字符串不匹配,您的 dateString 应该按照您的 [dateFormat setDateFormat:@"yyyy-MM-dd hh:mm:ss"];

        2013-10-09 02:40:29

        nil 表示 dateFormat 对象无法解析您的字符串。

        【讨论】:

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