为iOS NSDate解析RSS Times和DST

时间:2014-05-06 15:35:58

标签: ios rss nsdate dst

这是我已经有很长一段时间的问题了,我不能为我的生活做好准备。使用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。希望这有助于证明问题。

1 个答案:

答案 0 :(得分:1)

the RSS 2.0 Specification

  

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,那么你无法区分这两点。