分析rfc3339日期与NSDateFormatter在iOS4.x和mac os X10.6:不可能?
-
30-09-2019 - |
题
分析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项目在想.这工作很适合我分析完全格式的日期描述。
其他提示
–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;
}