代码之家  ›  专栏  ›  技术社区  ›  Dr Nic

通过cocoa的nsdate解析不支持的日期格式

  •  13
  • Dr Nic  · 技术社区  · 16 年前

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

    4 回复  |  直到 16 年前
        1
  •  31
  •   Seamus Campbell    13 年前

    你可以使用 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不需要,因为这里的默认模式是此模式。

        2
  •  6
  •   Peter Hosey    16 年前

    如果只需要处理ISO 8601格式(以该字符串为例),可以尝试 my ISO 8601 parser and unparser .

        3
  •  6
  •   DenNukem    13 年前

    实际上,您需要设置时区、日历和区域设置。如果不设置区域设置,则用户启用了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];
    
        4
  •  1
  •   Jorge Perez    12 年前

    时区的设置方式从iOS 5更改为iOS 6。iOS6支持使用zzzzz的格式+01:00,但iOS5不支持。我用这个解决方案解决了这个问题,我可以用iOS5和6中的以下格式解析日期。

    2013年5月7日00: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];