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