2010-06-22 55 views
30

我想創建一個格式,將轉換顯示一個NSDate對象的日期格式:iPhone NSDateFormatter時區轉換

NSString *dateStr = @"2010-06-21T19:00:00-05:00"; 
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"]; 
NSDate *date = [dateFormat dateFromString:dateStr]; 

問題是時區-05:00,這是不符合的正確解析上面的格式。有什麼建議麼?

+0

貴模式真正匹配輸入? – willcodejavaforfood 2010-06-22 15:45:03

+1

格式完全符合時區(-05:00)。如果我刪除':'格式化程序工作。試圖瞭解是否有辦法讓格式化程序能夠正確解析時區。 – 2010-06-22 16:06:23

+0

這裏見我的回答:http://stackoverflow.com/questions/3094819/nsdateformatter-returning-nil-in-os-4-0/3968411#3968411 – 2012-12-07 14:48:41

回答

30

說實話,你只需要在通過格式化程序運行之前更改源數據(除去冒號)。您的原始日期字符串是非標準的,並且沒有任何時區格式字符串可以正常工作。

您可以看到有效輸入on unicode.org

ZZZ例如「-0500」

ZZZZ例如「GMT-05:00」

沒有爲 「-05:00」

+0

嘗試任意數量的方法之後,這是我看中了爲好。謝謝 – 2010-06-22 21:00:36

+0

我知道這是一個古老的問題,但我想評論說我面臨完全相同的格式問題。該格式是ISO 8601格式,這是一種非常標準的格式。 – 2012-08-21 00:22:28

+1

感謝您對時區中額外的答案:我在谷歌rss feed中獲得了-04:00的時區,這讓我瘋狂了好幾個小時。把你的解決方案改成-0400是個訣竅。 – jangelo42 2012-09-21 00:51:44

1

這是默認的時間格式我從西納特拉的ActiveRecord後端得到。這是我的解決方案。

-(NSDate *) dateFromString:(NSString *)string{ 
    NSMutableString * correctedDateString = [[NSMutableString alloc] initWithString:string]; 
    [correctedDateString deleteCharactersInRange: NSMakeRange(22, 1)]; 

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"]; 

    return [formatter dateFromString:correctedDateString]; 
} 
+0

對iOS 5仍然有用。 – Martin 2013-03-12 16:49:05

64

要使用冒號處理時區,您只需要使用5'Z'。這是一種非常常見的日期格式,即ISO-8601格式。這隻會在iOS 6.x的工作+

-(NSDate *) dateFromString:(NSString *)string { 

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"]; 

    return [formatter dateFromString:string]; 
} 
+4

證實這是比接受的答案更好的解決方案! – Byte 2013-01-08 18:55:34

+2

適用於iOS6.0 +,但不適用於5.0或5.1 – 2013-02-05 12:29:35

+0

是5 Z的作品 - 繼承人類別 https://github.com/clearbrian/NSDateFormatter_ISO_8601 – 2014-03-04 13:17:43

2

可能是我錯過了什麼,但ZZ爲我工作。 我用:

@"yyyy-MM-dd'T'HH:mm:ss.SSSZZ" 

2014-02-27T08:00:00.000+04:00 
1

這僅僅是爲我工作的解決方案:

[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];