Ios NSDate提取组件错误-不是同一天?

Ios NSDate提取组件错误-不是同一天?,ios,nsdate,nsdatecomponents,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 =

我的目标是获取一个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
如你所见,日子变了


有什么想法吗?谢谢你

Ludovic,因为NSDate只是“时间线中的一个时刻”,当你对NSDate进行NSLog时,它会以格林尼治时间的时区(即时间后的+0000)打印出来,并且由于你没有为你的
NSDate组件定义任何时区
comps
对象,它只是使用GMT+0转换为NSDate,您可能处于GMT+2区域

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

[comps setTimeZone:[NSTimeZone localTimeZone]];

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

Ludovic,因为NSDate只是“时间线中的一个时刻”,当您对NSDate进行NSLog时,它会将其打印为格林尼治时间的时区(即时间后的+0000)-并且由于您没有为
NSDateComponents
comps
对象定义任何时区,它只是使用GMT+0转换为NSDate,您可能处于GMT+2区域

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

[comps setTimeZone:[NSTimeZone localTimeZone]];
或者设置所需的时区(如果不是本地的)。

这是您所在时区的正确日期(GMT+2对吗?)这是您所在时区的正确日期(GMT+2对吗?)