在via Cocoa的NSDate中解析不支持的日期格式

时间:2008-12-30 04:24:51

标签: cocoa parsing date

使用Cocoa框架,如何将@“2008-12-29T00:27:42-08:00”解析为NSDate对象?标准-dateWithString:不喜欢它。

4 个答案:

答案 0 :(得分:31)

您可以使用NSDateFormatter来解析日期:

    NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
    date = [dateFormatter dateFromString:dateStr];

unicode date format patterns定义了可以与setDateFormat:方法一起使用的格式字符串。

请注意,如果您的目标是10.4,则需要致电:[dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];。不需要iphone或leopard,因为此模式是默认模式。

答案 1 :(得分:6)

如果您只需要处理ISO 8601格式(该字符串就是一个示例),您可以尝试my ISO 8601 parser and unparser

答案 2 :(得分:6)

实际上,您需要设置时区,日历和区域设置。如果您未设置区域设置,则用户启用了AM / PM时间,格式化程序将添加AM / PM标记!如果您没有设置时区,它将使用当前时区,但会将其标记为“Z”(“Zulu”或GMT)。如果你没有设置日历,那么拥有日本帝国历法的用户将拥有自当前皇帝提升以来的年数,而不是自耶稣基督诞生以来的年数。一定要在我提到的所有场景中进行测试!

    NSDateFormatter * f = [[NSDateFormatter alloc] init];
    [f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
    NSString * str = [f stringFromDate:someDate];
    NSDate * date = [f dateFromString:dateStr];

答案 3 :(得分:1)

如何设置时区从ios 5更改为ios 6. iOS 6支持使用ZZZZZ格式+01:00但ios 5不支持。我用这个解决方案解决了这个问题,这个解决方案让我在ios 5和6中使用以下格式解析日期。

2013-05-07T00:00:00 + 01:00

NSMutableString *newDate = [date mutableCopy];
NSRange range;
range.location = 22;
range.length = 1;
[newDate replaceCharactersInRange:range withString:@""];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZ"];    
NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:newDate];