2010-06-22 42 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"];