Update
Clocks:
时间 1: ≈ 0.000139 - 选项 1 - 原始
时间 2: ≈ 0.000108 - 选项 2
时间 3: ≈ 0.000013 - 选项 3
时间 4: ≈ 0.000004 - 选项 4
选项 1 - 原始
NSDate* originDate = [[NSDate alloc] init];
NSDate* date = [[NSDate alloc] init];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents* components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit
| NSDayCalendarUnit | NSHourCalendarUnit
| NSSecondCalendarUnit) fromDate:date];
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
date = [calendar dateFromComponents:components];
NSLog(@"Time 1: %f", -[originDate timeIntervalSinceNow]);
选项2
你不需要
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
只是不要将这些添加为日期组件的选项
NSDate* originDate2 = [[NSDate alloc] init];
NSDate* date2 = [[NSDate alloc] init];
NSCalendar *calendar2 = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents* components2 = [calendar2 components:(NSYearCalendarUnit | NSMonthCalendarUnit
| NSDayCalendarUnit
) fromDate:date2];
date2 = [calendar2 dateFromComponents:components2];
NSLog(@"Time 2: %f", -[originDate2 timeIntervalSinceNow]);
资料来源:类似问题 https://stackoverflow.com/a/4832602/2611971+ 大卫的评论
选项3
基本上,我发现如果我使用已创建的 NSCalendar 运行该方法,我的速度始终会提高 85% 到 90%。
在运行该方法之前声明 calendarProperty 并初始化它
NSDate* originDate3 = [[NSDate alloc] init];
NSDate* date3 = [[NSDate alloc] init];
NSDateComponents* components3 = [calendarProperty components:(NSYearCalendarUnit | NSMonthCalendarUnit
| NSDayCalendarUnit
) fromDate:date3];
date3 = [calendarProperty dateFromComponents:components3];
NSLog(@"Time 3: %f", -[originDate3 timeIntervalSinceNow]);
选项4
*基于@HotLicks的评论*
避免所有那些烦人的 dateComponents - 大约快 95%
我不确定选项 4 在实践中的一致性如何,但它的计时速度最快,而且到目前为止对我来说是可靠的。
NSDate* originDate4 = [[NSDate alloc] init];
NSDate* date4 = [[NSDate alloc] init];
float date4Interval = [date4 timeIntervalSince1970];
int totalDays = date4Interval / (60 * 60 * 24);
date4 = [NSDate dateWithTimeIntervalSince1970:totalDays * 60 * 60 * 24];
NSLog(@"Time 4: %f", -[originDate4 timeIntervalSinceNow]);