NSDateFormatter dateFromString始终返回nil

Mac*_*185 16 nsdate nsdateformatter ios

我想提前道歉,问一个重复的问题,但其他解决方案都没有对我有用.每次我尝试将日期字符串传递给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;
Run Code Online (Sandbox Code Playgroud)

我已根据我为解决此问题而阅读的所有解决方案设置了dateFormat,但这些设置都没有解决问题.systemLocale肯定是为英语设置的,所以不应该导致任何问题.

这是我传递给dateFromString的dateString:

Wednesday, October 9, 2013 at 2:40:29 PM Pacific Daylight Time
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

nei*_*lco 41

这里有两个问题:

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

  2. 将formatter的语言环境设置[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];
Run Code Online (Sandbox Code Playgroud)

  • @olie使用`yyyy-MM-dd HH:mm:ss`因为你的时间是24小时制.如果你想让1am为"1:00",请使用"H:mm".如果你想要零填充,即01:00,请使用"HH:mm". (4认同)
  • @Macros185不用担心.如果您将来可能需要它[日期格式符号的参考](http://www.unicode.org/reports/tr35/tr35-25.html#Date_Field_Symbol_Table).另外,如果你愿意点击我的答案旁边零点上方的小向上箭头,我会很感激:) (3认同)

Oli*_*lie 25

获得nil的另一种方法是,如果你使用hh并且你的小时数是24小时制,大于12小时,那么你需要HH(或者H,零填充).

那是:

  • 格式:yyyy-MM-DD hh:mm:ss,string:"2016-03-01 13:42:17"将返回零
  • 格式:yyyy-MM-DD HH:mm:ss,string:"2016-03-01 13:42:17"将返回您期望的日期.

为此提供给@neilco的帽子(请参阅他的回答下面的评论).如果你喜欢这个答案,请向他投票.


Chr*_*ris 5

根据NSDateFormatter 文档

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

如果您的日期格式是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
Run Code Online (Sandbox Code Playgroud)