1

我有以下代码通过使用日期中的 YEAR、MONTH 和 DAY 组件来将日期的时间设置为 0 小时、0 分钟和 0 秒,以构造一个新的:

NSDate *date = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit) fromDate:date];
NSDate *newDate = [gregorian dateFromComponents:comps];
NSLog(@"date: %@, newDate: %@", date, newDate);

输出是:

date: 2012-11-06 11:44:09 +0000, newDate: 2012-11-05 23:00:00 +0000

但我期待新的日期是:2012-11-06 00:00:00 +0000 我应该知道发生了什么?

4

2 回答 2

1

NSLog显示日期,使用-[NSDate description]这些日期将存储在 中的绝对时间转换NSDate为字符串。此转换使用 UTC 作为时区完成。

对于您的情况,最好也使用 UTC 进行日期计算。为此,请调整执行计算的日历对象:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
于 2012-11-06T14:26:41.650 回答
-1

有关类似的 Stack Overflow 问题,请参阅此答案。

这应该可以解决您的夏令时问题:

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];

[formatter setCalendar:[NSCalendar currentCalendar]];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

NSString *string = [formatter stringFromDate:[NSDate date]];
于 2012-11-06T12:06:00.647 回答