2012-11-06 25 views
1

我有以下代码将日期时间设置为0小时,0分钟,0秒,通过使用日期中的YEAR,MONTH和DAY组件来构建一个新的:NSDate设置的时间,而不是预期的结果

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 发生了什么事,我应该知道的?

回答

1

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

对于您的情况,最好还是以UTC为单位进行日期计算。要这样做,请调整执行计算的日历对象:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
-1

请参阅this answer对于类似的堆栈溢出问题。

这应该与夏令解决您的问题:

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

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

NSString *string = [formatter stringFromDate:[NSDate date]]; 
+0

使用上述格式化程序设置打印日期是相同的。您能否提供一些关于夏令时如何影响NSDate创建或日历的说明? – SolidSun

+0

通过考虑设备/用户设置的时区,夏令时会影响'[NSDate date]'的结果。通过使用不同的时区,可以确定与另一个时区相关的日期。请参阅对我的回答所做的修改。 – CaptainRedmuff

+0

@CaptainRedmuff“夏令时影响[NSDate date]的结果”:这是不正确的; 'NSDate'不受日历,时区,地区等的影响。'NSDate'代表绝对时间点。 –

相关问题