当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在viaCocoa的NSDate中解析不支持的日期格式》经验,为你挑选了3个好方法。

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



1> mfazekas..:

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

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

在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.我需要解析这样的日期,并且在绝望中最终在解析之前撕掉冒号.
如果用户在其iPhone上设置了AM/PM,则会产生错误的结果 - 将添加AM/PM标记.此外,如果用户使用日本帝国日历,这将获得该日历中的年份,而不是公历.要做到这一点,您需要在日期格式化程序上明确设置区域设置和日历.

2> Peter Hosey..:

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


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

3> DenNukem..:

实际上,您需要设置时区,日历和区域设置.如果您未设置区域设置,则用户启用了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];

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有