1

我的目标是获得一个 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

如你所见,天变了!

有任何想法吗 ?谢谢

4

1 回答 1

1

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

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

[comps setTimeZone:[NSTimeZone localTimeZone]];

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

于 2013-08-13T08:09:31.917 回答