17

我想提前道歉,因为我提出了一个重复的问题,但其他解决方案都没有对我有用。每次我尝试将日期字符串传递给 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

谢谢您的帮助!

4

7 回答 7

42

这里有两个问题:

  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];
于 2013-10-10T15:49:25.863 回答
27

另一种获得 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 致谢(请参阅他的回答下方的评论)。如果您喜欢这个答案,请也给他投票。

于 2016-03-07T22:09:17.527 回答
5

根据NSDateFormatter 文档

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

如果您的日期格式是,2017-06-16T17:18:59.082083ZdateFormat属性应如下所示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
于 2017-06-19T16:56:45.143 回答
2

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

2013-10-09 02:40:29

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

于 2013-10-10T15:41:50.647 回答
1

万一有人和我一样被困在同一个热闹的边缘案例上:

nil只要您处于遵循夏令时的区域设置中,“2020-03-08T02:00:00”就会返回,因为该小时被跳过并且根本不存在。

于 2020-08-04T19:38:48.953 回答
0

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

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

于 2013-10-10T15:42:03.653 回答
0

不要忘记转义"yyyy/MM/dd' 'HH:mm:ss"空格符号

于 2020-01-02T14:32:00.633 回答