NSDate设置时间,而不是预期结果

时间:2012-11-06 12:00:39

标签: ios datetime nsdate nscalendar nsdatecomponents

我有以下代码,通过使用日期中的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 我应该知道发生了什么?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:-1)

有关类似的Stack Overflow问题,请参阅this answer

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

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

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

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