2014-05-06 40 views
3

这是我一直存在的一个问题,我不能为了我的生活而正确地修复它。使用RSS源http://www.localendar.com/public/RogerJohnson?style=M3, 我有我的应用程序设置来解析XML并列出每个日历条目到一个TableView的行。这个问题在DST开始时弹出。 Localendar没有对如果DST发生的事件检查功能,所以在RSS提要的pubdate的总是显示为:为iOS解析RSS时间和DST NSDate

Fri, 02 May 2014 19:00:00 EST 

这一天的活动实际上是在下午7:00 EDT开始。因此,当应用程序转换所有内容时,需要将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,不管一年中的哪个时间,但是在DST期间不断变化。

我把一个NSLog的为NSDate的,我分析它,这里是我得到一个条目:

2014-05-03 00:00:00 +0000 

,在表视图中显示出来的时间是May 2nd, 2014 8:00PM,而实际事件发生在May 2nd, 2014 7:00PM。希望这有助于展示问题。

+0

请找到该链接 http://stackoverflow.com/questions/16741480/adjust-nsdate-by-one-hour-for-dst – Sam

回答

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)错误地发回EST,当它们意味着EDT时 - 这是您应该接受的错误。他们没有正确遵守RSS规范。

围绕在自己的代码的bug工作是可能的 - 但它不是最好的主意:

  • 有一天,他们会解决它,然后你的代码可能会被打破。

  • 当地时间可能在退步daylight saving time转换期间模棱两可。像"Sun, 2 Nov 2014 01:30:00 EST"这样的值应该具有单一含义,与"Sun, 2 Nov 2014 01:30:00 EDT"分开。通过假定EST = ET,那么你无法分辨这两点。