iPhone NSDateFormatter 时区转换

34

我正在尝试创建一个格式化程序,将所示日期格式转换为NSDate对象:

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,无法使用上述格式正确解析。有什么建议吗?

1
你的模式真的匹配输入吗? - willcodejavaforfood
1
格式在时区(-05:00)之前都是正确的。如果我去掉“:”,格式化程序就可以工作。尝试理解是否有一种方法可以拥有一个格式化程序,可以正确解析时区。 - John Muchow
请查看我的答案:https://dev59.com/3HA75IYBdhLWcg3w0cfx#3968411 - Werner Altewischer
你们能帮我回答这个问题吗?http://stackoverflow.com/questions/15162835/how-to-use-nsdateformatter-to-venezuela谢谢。 - tony
请按照Apple文档的建议,使用NSISO8601DateFormatter用户。 - DawnSong
6个回答

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
2
适用于iOS6.0+,但不支持5.0或5.1。 - Richard Groves
是的,5个Z的工作-这是一个类别https://github.com/clearbrian/NSDateFormatter_ISO_8601 - brian.clear
这对我没用(2016-04-04T00:00:00-5:00),但是这个可以 - yyyy-MM-dd'T'HH:mm:ssZ:z - user5936834

31

说实话,在将数据传递给格式化程序之前,您只需更改源数据(删除冒号)。 您的原始日期字符串是非标准的,因此任何时区格式字符串都无法正确处理它。

您可以在unicode.org上查看有效输入。

ZZZ 例如“-0500”

ZZZZ 例如“GMT-05:00”

对于“-05:00”没有匹配格式。


尝试了许多方法后,那也是我最终采用的。谢谢。 - John Muchow
我知道这是一个旧问题,但我想评论一下我也遇到了完全相同的格式问题。那个格式是ISO 8601格式,这是一个非常标准的格式。 - Chris C
1
谢谢你对时区中额外冒号的回答。我从Google的RSS源获取了一个带有-04:00的时区,这让我疯狂了几个小时。你的解决方案是将时区更改为-0400,这真是个好办法。 - jangelo42
3
这不再是最优解决方案。请看下面我的答案。 - brynbodayle
注意:使用小写字母“z”获取时区字符串(例如 zzz -> EDT - Albert Renshaw

3

也许我漏掉了什么,但是ZZ在我这里可行。 我使用了:

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

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

1

这是我从Sinatra 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];
}

1
这是唯一对我有效的解决方案:

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接