【问题标题】:Parse JSON date into NSDate depending user settings根据用户设置将 JSON 日期解析为 NSDate
【发布时间】:2013-01-21 09:45:02
【问题描述】:

我在转换原始 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]];

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

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

【问题讨论】:

标签: json nsdate nsdateformatter


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    这是毫秒时的格式 sn-p(例如 2014-02-27T09:30:00.000Z

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

    【讨论】:

    【解决方案3】:

    请使用下面对我来说完美的代码。

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

    Date Format Problem

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多