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

Dr *_*Nic 13 cocoa parsing date

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

mfa*_*kas 31

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

    NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
    date = [dateFormatter dateFromString:dateStr];
Run Code Online (Sandbox Code Playgroud)

Unicode的日期格式的模式定义您可以用使用格式字符串setDateFormat:的方法.

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

  • 我不能让这个用于格式化的字符串,如问题中的示例,松散似乎是RFC 3339格式,但在时区偏移量中使用冒号(以-08:00结尾).您在草案#4中链接的Unicode技术标准现在已达到#10草案,Z的处理方式有所改变 - 现在已经接受了4次并且有一个新的附录J - 但在任何情况下它都不是接受"-08:00"格式."格林威治标准时间-08:00",是的,和"-0800",是的,但没有结肠和没有GMT.我需要解析这样的日期,并且在绝望中最终在解析之前撕掉冒号. (5认同)
  • 如果用户在其iPhone上设置了AM/PM,则会产生错误的结果 - 将添加AM/PM标记.此外,如果用户使用日本帝国日历,这将获得该日历中的年份,而不是公历.要做到这一点,您需要在日期格式化程序上明确设置区域设置和日历. (2认同)

Pet*_*sey 6

如果您只需要处理ISO 8601格式(该字符串是一个示例),您可以尝试我的ISO 8601解析器和解析器.

  • 也许如果代码是通过MIT或Apache 2.0获得许可的话.由于归因条款,BSD很难与iPhone应用程序一起使用,因为大多数应用程序实际上并不使用二进制文件分发文档. (2认同)

Den*_*kem 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];
Run Code Online (Sandbox Code Playgroud)