我的应用使用来自localendar.com的Feed来创建即将发生的事件的表格视图。但问题是来自localendar的提要不考虑DST,因此他们最终会在事件实际开始后1小时显示提要的pubDate。我的应用程序解析了Feed并将日期带入了单元格中的详细信息行,这让人感到困惑。我试图让我的应用程序检测用户是否在DST中,如果是,则从日期减去一小时。但是,当我使用下面的代码时,没有任何变化,并且永远不会在isDaylightSavingsTime属性标记上调用NSLog。
更新:
我在cellForRowAtIndexPath中尝试了一种不同的方法:
NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
NSString *articleDateString = [dateFormatter stringFromDate:entry.articleDate];
NSLog(@"after formatter %@", articleDateString);
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", articleDateString];
问题是RSS feed pubDate中的时间不适用于夏令时,因此一年中有一个小时的时间。格式化程序按时区执行所有操作都是正确的,因为Feed中的时间已经错误,因为它使用GMT而非美国时间。
请不要投票支持关闭。这不太局部化,它适用于美国每个有夏令时的州。
以下是两张更好地描述问题的照片。第一个显示RSS Feed中的内容,第二个显示日历中的正确时间。
如您所见,Feed中的时间显示为10:00,而显示每个位置的实际时间,但RSS Feed显示为:
更新2:
我尝试在我的代码中手动将时区设置为Central,但它仍然做同样的事情。在cellForRowAtIndexPath中我有:
RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"America/Menominee"]];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", articleDateString];
但是,不是让detailTextLabel.text显示为5/27/13 10:00 PM,它仍显示5/27/13 11:00 PM。
答案 0 :(得分:1)
建议使用
[formatter setTimeZone:localTimeZone];
代替。
答案 1 :(得分:0)
似乎问题是他们用“CST”显示所有日期,但是他们正在进行DST校正。 CST永远不会为isDaylightSavingTime
返回YES,因为它是如何定义的;当夏令时生效时,“中央时间”从CST变为CDT。
解决此问题的最简单方法是忽略Feed中的时区标识符,并始终将日期视为相对于[NSTimeZone timeZoneWithName:@"America/Menominee"]
。 (或中部时间的其他时区。)
编辑:要清楚,您需要在解析日期时设置NSDateFormatter的时区,而不是在格式化显示时。也就是说,您需要进行的更改不在您显示的代码中。