分析rfc3339日期与NSDateFormatter似乎是不可能的,在一般的情况。我错了吗?[编辑2年后:现在有一种方式!见下文,脚注。]

一个不是-尤其是延展性的网络服务是给我的日期,如:

2009-12-31T00:00:00-06:00

Rfc3339符合标准,默认输出的修订的图书馆使用它们。注意结肠,其rfc3339 需要 当偏不是一个文字"z":

time-numoffset  = ("+" / "-") time-hour ":" time-minute
time-offset     = "Z" / time-numoffset

我想要分析这些成NSDates.

NSDateFormatter想模式,在语法规定由 Unicode, 所提供的新场符号的时区,如"PDT","-0800","格林尼治标准时间-08:00"而不是"-08:00".

谷歌上搜索和其他类似这样的问题,仅产生的日期格式样

[myDateParser setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"];
/* or: */ [myDateParser setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];

后者需要文字"Z",前者坚持要么缺乏一个结肠或者存在"GMT".然而,他们出现工作之前ios4.x(可能通过放弃tz偏完全;我的数据不清楚。)

我选择在这一点上是一个对不起很多:

  • 发现一些无证件的格式说明,或一些奇怪的方式把NSDateFormatter入,这将接受流浪结肠:跳槽,很可能不存在的。[脚注]
  • 说服我的服务发行把所有日期为祖鲁时间和指定"Z":在政治上具有挑战性。
  • 写我自己的NSFormatter类或研究的好老 strptime_l:的工作。:)
  • string-操纵我的输入输条的最后结肠:脆弱的和丑陋,但是有可能的。

我有没有理解局势的准确的,即当前NSDateFormatter下unicode严格没有扩展;以及unicode的格式不足以充分描述rfc3339日期?

[脚注] 我回来的这三年后粘在一个小小的增编:Unicode和苹果添加这种特征的格式串,iOS6/OSX10.8.比较 最新修订,作为这种写作其直接的前任, ,并注意的另外5"Z"s,这将产生一个区域的格式,如"-08:00".所以如果你可以逃脱逃支持5.x/10.7,有一个新权利的方式来做到这一点。我会离开之前回答的立场,因为它仍然是最好的方法时,向后兼容性是必需的。

有帮助吗?

解决方案

日字符串分析在可可可以是一个痛苦,尤其是如果你要处理的日期产生的。净基于网络的服务。

我建议看NSDate+InternetDateTime类别,迈克尔*瀑布有关NSDate作的一部分,他MWFeedParser项目在想.这工作很适合我分析完全格式的日期描述。

https://github.com/mwaterfall/MWFeedParser/

其他提示

–getObjectValue:forString:范围:错误:实际上可以分析RFC3339日期正确。我不知道为什么-dateWithString:不:

// RFC3339 date formatting
NSString *dateString = @"2012-04-11T18:34:19+00:00";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";

NSDate *date;
NSError *error;
[formatter getObjectValue:&date forString:dateString range:nil error:&error];

串的字符格式记录在任何地方的苹果文件。而不是还有一个链接深藏在一些文献指码标准在

http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns

使用的信息链接,很简单:

- (NSDate*)dateFromRFC3339String:(NSString*)aString
{
    static NSDateFormatter* sRFC3339DateFormatter = nil;
    static NSDateFormatter* sRFC3339DateFormatterSubSeconds = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

        sRFC3339DateFormatter = [[NSDateFormatter alloc] init];
        [sRFC3339DateFormatter setLocale:enUSPOSIXLocale];
        [sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssXXXXX"];
        [sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

        sRFC3339DateFormatterSubSeconds = [[NSDateFormatter alloc] init];
        [sRFC3339DateFormatterSubSeconds setLocale:enUSPOSIXLocale];
        [sRFC3339DateFormatterSubSeconds setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSSSSXXXXX"];
        [sRFC3339DateFormatterSubSeconds setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    });

    NSDate* date = [sRFC3339DateFormatter dateFromString:aString];
    if (date == nil)
        date = [sRFC3339DateFormatterSubSeconds dateFromString:aString];

    return date;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top