为夏令时调整NSDate一小时

时间:2013-05-24 18:32:36

标签: ios objective-c nsdate

我的应用使用来自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中的内容,第二个显示日历中的正确时间。

enter image description here

如您所见,Feed中的时间显示为10:00,而显示每个位置的实际时间,但RSS Feed显示为:

enter image description here

更新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。

2 个答案:

答案 0 :(得分:1)

建议使用

[formatter setTimeZone:localTimeZone];

代替。

答案 1 :(得分:0)

似乎问题是他们用“CST”显示所有日期,但是他们正在进行DST校正。 CST永远不会为isDaylightSavingTime返回YES,因为它是如何定义的;当夏令时生效时,“中央时间”从CST变为CDT。

解决此问题的最简单方法是忽略Feed中的时区标识符,并始终将日期视为相对于[NSTimeZone timeZoneWithName:@"America/Menominee"]。 (或中部时间的其他时区。)

编辑:要清楚,您需要在解析日期时设置NSDateFormatter的时区,而不是在格式化显示时。也就是说,您需要进行的更改不在您显示的代码中。