这是我已经有很长一段时间的问题了,我不能为我的生活做好准备。使用RSS Feed http://www.localendar.com/public/RogerJohnson?style=M3, 我将我的应用程序设置为解析XML并将每个日历条目列入TableView的行。 DST开始时会弹出问题。 Localendar没有用于检查DST中是否发生事件的功能,因此在RSS源中,pubDate始终显示为:
Fri, 02 May 2014 19:00:00 EST
该日的活动实际上是美国东部时间下午7点开始的。因此,当应用程序转换所有内容时,它将EST置于心脏,并且知道它当前在DST中,将时间显示为美国东部时间20:00:00。如何正确设置此NSDate,以便无论是否为DST,它将显示7:00而不是按小时调整?
以下是我解析RSS的方法:
NSString *articleDateString = [item valueForChild:@"pubDate"];
NSDate *articleDate = [NSDate dateFromInternetDateTimeString:articleDateString formatHint:DateFormatHintRFC822];
NSLog(@"%@", articleDate);
RSSEntryCalendar *entry = [[[RSSEntryCalendar alloc] initWithBlogTitle:blogTitle articleTitle:articleTitle articleUrl:articleUrl articleDate:articleDate articleImage:bodyoftext] autorelease];
然后,在表格视图中显示我对于cellForRowAtIndexPath:
RSSEntryCalendar *entry = [_allEntries objectAtIndex:indexPath.row];
NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
NSString *articleDateString = [dateFormatter stringFromDate:entry.articleDate];
cell.detailTextLabel.text = articleDateString;
如前所述,pubDate始终显示EST,无论DST是否生效。如果它显示19:00:00它应该是7,不管一年中的什么时间,但是在夏令时期间不断变化。
我为NSDate输入了一个NSLog,我解析它,这是我得到的一个条目:
2014-05-03 00:00:00 +0000
表格视图中显示的时间为May 2nd, 2014 8:00PM
,而实际事件发生在May 2nd, 2014 7:00PM
。希望这有助于证明问题。
答案 0 :(得分:1)
RSS中的所有日期时间均符合 RFC 822 的日期和时间规范,但年份可以用两个字符或四个字符(四个首选)表示。
每RFC 822:
zone = "UT" / "GMT" ; Universal Time
; North American : UT
/ "EST" / "EDT" ; Eastern: - 5/ - 4
/ "CST" / "CDT" ; Central: - 6/ - 5
/ "MST" / "MDT" ; Mountain: - 7/ - 6
/ "PST" / "PDT" ; Pacific: - 8/ - 7
/ 1ALPHA ; Military: Z = UT;
; A:-1; (J not used)
; M:-12; N:+1; Y:+12
/ ( ("+" / "-") 4DIGIT ) ; Local differential
; hours+min. (HHMM)
正如您所看到的,RFC 822日期的时区缩写集非常有限 - 但它们在规范中并且具有非常特定的含义。 “EST”= UTC-5。
如果你正在使用的服务(Localendar)在他们意味着EDT时错误地发回EST - 这是一个你应该接受它们的错误。他们没有正确遵守RSS规范。
可以在你自己的代码中解决这个问题 - 但这不是最好的想法:
有一天他们可能会修复它,然后你的代码就会崩溃。
在后退daylight saving time过渡期间,当地时间可能不明确。像"Sun, 2 Nov 2014 01:30:00 EST"
这样的值应该具有单一含义,与"Sun, 2 Nov 2014 01:30:00 EDT"
分开。假设EST = ET,那么你无法区分这两点。