1

我在转换原始 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 字符串创建的。

我阅读了此讨论,但找不到与所有国际用户和设置一起工作的好方法。

例如,我添加了这个:

[dateFormatter setLocale:[NSLocale currentLocale]];

但它什么也没改变。如果我将 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

我错过了什么 ?日期格式有什么要更新的吗?

4

3 回答 3

12

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

[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssz"];

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

如果您的 dateString 不统一,请对 dateFormat 进行回退检查。检查转换后的日期是否为零,如果为零,则使用回退 dateFormat。

除非日期字符串和系统日历的日历类型发生变化,否则也无需将日历设置为 dateFormatter。

于 2013-06-18T12:44:09.863 回答
9

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

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

[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSz"];
于 2014-02-23T23:58:46.403 回答
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;
}

日期格式问题

于 2013-01-21T10:05:05.967 回答