我有一个转换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;
}
问题是这适用于95%的情况,但如果某些用户在日期和时间设置与自定义国际设置相结合时使用AM / PM而不是24H,则不会从json字符串创建日期。
我读了这个discussion,但我找不到与我所有国际用户和设置合作的好方法。
我添加了这个例子:
[dateFormatter setLocale:[NSLocale currentLocale]];
但它没有改变。如果我使用AM / PM而不是24H设置我的iPhone,则不会创建NSDate。
AM / PM NSDate架构: 2013-01-21 07:12:43 AM +0000
24H NSDate架构: 2013-01-21 07:12:43 +0000
我错过了什么?是否有更新的日期格式?
答案 0 :(得分:12)
您只需要设置正确的dateFormat,其余代码都是正确的。
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssz"];
dateString中的字符Z
是ISO8601定义的有效日期格式,表示日期字符串是UTC时区。因此,您无需将时区设置为格式化程序。 Formatter可以识别字符Z
中的时区。因此,如果被忽略,除非为dateFormatter指定了时区,否则时区会出现不匹配。
如果你的dateString不统一,请对dateFormat进行后退检查。检查转换日期是否为零,如果没有使用回退日期格式。
除非日期字符串和系统日历的日历类型发生更改,否则无需将日历设置为dateFormatter。
答案 1 :(得分:9)
我试图做同样的事情,但在我的情况下,JSON日期也包括毫秒,日期来自MongoDB。
以下是您有毫秒(例如2014-02-27T09:30:00.000Z
)
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSz"];
答案 2 :(得分:1)
请使用以下适合我的代码。
NSString* strDate = [jsonObj objectForKey:@"created_at"];
NSDate *date = [self dateWithJSONString:strDate];
- (NSDate*)dateWithJSONString:(NSString*)dateStr
{
// Convert string to date object
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
NSDate *date = [dateFormat dateFromString:dateStr];
// This is for check the output
// Convert date object to desired output format
[dateFormat setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; // Here you can change your require output date format EX. @"EEE, MMM d YYYY"
dateStr = [dateFormat stringFromDate:date];
NSLog(@"Date -- %@",dateStr);
return date;
}