为夏令时调整NSDate一小时
我的应用程序使用来自localendar.com的提要来创建即将发生的事件的表格视图。 但问题是来自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中的时间不适用于DST,所以它是一年半的一小时。 格式化程序按时区执行所有操作都是正确的,因为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。
建议使用
[formatter setTimeZone:localTimeZone];
代替。
似乎问题是他们用“CST”显示所有日期,但他们正在进行DST校正。 对于isDaylightSavingTime
,CST永远不会返回YES,因为它是如何定义的; 当夏令时生效时,“中央时间”从CST变为CDT。
解决此问题的最简单方法是忽略Feed中的时区标识符,并始终将日期视为相对于[NSTimeZone timeZoneWithName:@"America/Menominee"]
相对日期。 (或中部时间的其他时区。)
编辑:要清楚,您需要在解析日期时设置NSDateFormatter的时区,而不是在格式化显示时。 也就是说,您需要进行的更改不在您显示的代码中。