NSDateFormatter以看似正确的格式字符串返回Nil

时间:2016-01-18 18:59:53

标签: ios objective-c nsdateformatter

我正在使用NSDateFormatter从服务器时间字符串生成NSDate对象。我们正在使用ISO-8601 Extended,以下是我的方法,它返回一个处理转换的日期格式化程序:

+ (NSDateFormatter *) dateFormatter {
    NSDateFormatter * dateFormatter = [NSDateFormatter new];
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSZ";
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US_POSIX"];
    return dateFormatter;
}

但是,当我使用该代码时,以下断言失败:

NSDateFormatter * dateFormatter = [MyClass dateFormatter]; 
                                            //    "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
_testDateObject = [dateFormatter dateFromString: @"2016-01-18'T'16:31:16.401Z"];
NSParameterAssert(_testDateObject);

我正在使用的日期格式化字符串有什么问题?我尝试了它的变体(例如转义文字),但没有一个产生有效的NSDate

修改 我的原帖包含了我正在使用的格式错误的字符串。正如rmaddy指出的那样,我应该使用yyyy-MM-dd'T'HH:mm:ss.SSSZ,我就是这样。

1 个答案:

答案 0 :(得分:2)

您的问题是您的输入字符串"2016-01-18'T'16:31:16.401Z"与您的格式不符。

在格式字符串中,'字符开始和结束转义的字符序列。格式子字符串'T'匹配输入子字符串T输入子字符串'T'。由于格式字符串中的任何内容都与输入中的单引号不匹配,因此转换失败。

如果您确实希望输入包含单引号,则必须在格式中使用加倍的单引号来匹配它们,使用单引号来转义T

let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd'''T'''HH:mm:ss.SSSZ"
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")

let date = formatter.dateFromString("2016-01-18'T'16:31:16.401Z")

// Result:
"Jan 18, 2016, 10:31 AM"
相关问题