NSDate提取组件bug - 不是同一天?

时间:2013-08-13 07:53:07

标签: ios nsdate nsdatecomponents

我的目标是让NSDate代表与另一个NSDate同一天,但小时,分钟,秒设置为0.

所以2013/11/27 13:23:32将成为2013/11/27 00:00:00。

我做了这个功能,我在互联网上找到了例子

+ (NSDate*)dayEarliestDateForDate:(NSDate*)date {
    NSCalendar* calendar = [NSCalendar currentCalendar];
    NSDateComponents* comps = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date];
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:0];
    NSDate* dateEarliest = [calendar dateFromComponents:comps];
    return dateEarliest;
}

但奇怪的是,当我运行它时

NSDate* date2 = [NSDate dayEarliestDateForDate:date1];

我明白了:

(lldb) po date1
$3 = 0x11d98dc0 2013-08-**13** 07:37:58 +0000
(lldb) po date2
$4 = 0x140588f0 2013-08-**12** 22:00:00 +0000

如你所见,这一天发生了变化!

有什么想法吗?谢谢

1 个答案:

答案 0 :(得分:1)

Ludovic,因为NSDate只是“时间轴上的一个时刻”,当您对NSDate进行NSLog时,它会以格林威治时间的时区(即时间后的+0000)打印出来 - 当你没有为您的NSDateComponents comps对象定义任何时区,它只是使用GMT + 0转换为NSDate,而您可能处于GMT +2区域。

为了解决这个问题,我建议你将NSDateComponents的时区设置为对象。

[comps setTimeZone:[NSTimeZone localTimeZone]];

或设置所需的时区,以防它不是本地时区。