2013-01-21 25 views
1

我有一個問題,用於將一個香檳JSON字符串日期:解析JSON日期到的NSDate取決於用戶設置

「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年1月21日上午07時12分43秒+0000

24H NSDate的模式: 2013年1月21日7時12分43秒+0000

什麼我錯過了嗎?有什麼需要更新的日期格式?

+0

添加此:[jsonDateFormatter的setLocale:[[NSLocale的alloc] initWithLocaleIdentifier:@ 「en_US_POSIX」]];現在可以了。 –

+0

本技術說明適用於:http://developer.apple.com/library/ios/#qa/qa1480/_index.html –

回答

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

Date Format Problem

12

你只需要設置正確的日期格式,你的代碼的其餘部分是正確的。

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

字符Z在dateString是ISO8601定義的有效日期格式,它表示該日期字符串在UTC時區。所以你不需要設置格式化程序的時區。格式化程序可以識別字符Z的時區。因此,如果忽略它,那麼除非將時區指定給dateFormatter,否則時區中會出現不匹配。

如果您的dateString不統一,請對dateFormat進行回退檢查。檢查轉換日期爲零,如果沒有使用回退dateFormat。

除非日曆字符串和系統日曆的日曆類型發生變化,否則不需要將日曆設置爲dateFormatter。

8

我試圖做同樣的事情,但在我的情況下,JSON日期還包括毫秒,日期來自MongoDB。

這裏是格式化的代碼片段,當你有毫秒(例如2014-02-27T09:30:00.000Z

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