根据用户设置将JSON日期解析为NSDate

ale*_*our 1 json nsdate nsdateformatter

我有一个转换一个brut JSON字符串日期的问题:

"created_at"="2012-12-22T21:39:22Z";

进入NSDate.

这是我目前的类别:

- (NSDate*)dateWithJSONString
{
[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4];
 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[dateFormatter setCalendar:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]];
NSDate *date = [[NSDate alloc] init];
date = [dateFormatter dateFromString:self];
return date;        
}
Run Code Online (Sandbox Code Playgroud)

问题是95%的情况都适用,但如果某些用户在日期和时间设置与自定义国际设置相结合时使用AM/PM而不是24H,则不会从json字符串创建日期.

我阅读了这个讨论,但我找不到与我所有国际用户和设置合作的好方法.

我添加了这个例子:

[dateFormatter setLocale:[NSLocale currentLocale]];
Run Code Online (Sandbox Code Playgroud)

但它什么都没改变.如果我将我的iPhone设置为AM/PM而不是24H,则不会创建NSDate.

AM/PM NSDate架构:2013-01-21 07:12:43 AM +0000

24H NSDate架构:2013-01-21 07:12:43 +0000

我错过了什么 ?是否有更新的日期格式?

Anu*_*das 12

您只需要设置正确的dateFormat,其余代码都是正确的.

[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssz"];
Run Code Online (Sandbox Code Playgroud)

ZdateString中的字符是ISO8601定义的有效日期格式,表示日期字符串是UTC时区.因此,您无需将时区设置为格式化程序.Formatter可以识别字符的时区Z.因此,如果被忽略,除非为dateFormatter指定了时区,否则时区中将存在不匹配.

如果你的dateString不统一,请对dateFormat进行后退检查.检查转换日期是否为零,如果没有使用回退日期格式.

除非日期字符串和系统日历的日历类型发生更改,否则无需将日历设置为dateFormatter.


Ted*_*ery 9

我试图做同样的事情,但在我的情况下,JSON日期也包括毫秒,日期来自MongoDB.

这是您有毫秒时的格式代码段(例如2014-02-27T09:30:00.000Z)

[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSz"];
Run Code Online (Sandbox Code Playgroud)