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

4

6 回答 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];
}
于 2012-12-18T23:01:44.390 回答
31

老实说,您只需要在通过格式化程序运行它之前更改源数据(删除冒号)。您的原始日期字符串是非标准的,任何时区格式字符串都不能正常工作。

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

ZZZ 例如“-0500”

ZZZZ 例如“GMT-05:00”

“-05:00”没有任何内容

于 2010-06-22T19:32:58.337 回答
3

可能是我错过了一些东西,但ZZ为我工作。我用了:

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

为了

2014-02-27T08:00:00.000+04:00
于 2014-03-07T11:16:47.613 回答
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];
}
于 2012-11-29T14:44:36.673 回答
1

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

[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
于 2015-05-19T23:18:57.587 回答
0

5 ZZZZZ - 这是我写的一个类别,其中包含 GMT 到 BST 的一些样本

https://github.com/clearbrian/NSDateFormatter_ISO_8601

于 2014-03-04T13:18:53.647 回答