NSDateFormatter dateFromString始终返回nil

时间:2013-10-10 15:28:47

标签: ios nsdate nsdateformatter

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

感谢您的帮助!

7 个答案:

答案 0 :(得分:40)

这里有两个问题:

  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]

  3. 格式化程序的完整代码应为:

        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];
    

答案 1 :(得分:23)

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

那是:

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

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

答案 2 :(得分:2)

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

2013-10-09 02:40:29

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

答案 3 :(得分:2)

根据NSDateFormatter documentation

  

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

如果您的日期格式为2017-06-16T17:18:59.082083Z,则dateFormat属性应如下yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ

Swift 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

答案 4 :(得分:1)

万一有人被困在与我同一个搞笑的边缘情况下:

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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