正在计算时差 iOS
Calculating hour difference iOS
我这样写是为了计算时差
+ (NSInteger)hoursBetweenDate:(NSDate*)fromDateTime andDate:(NSDate *)toDateTime
{
NSDate *fromDate;
NSDate *toDate;
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[calendar rangeOfUnit:NSHourCalendarUnit startDate:&fromDate
interval:NULL forDate:fromDateTime];
[calendar rangeOfUnit:NSHourCalendarUnit startDate:&toDate
interval:NULL forDate:toDateTime];
NSDateComponents *difference = [calendar components:NSHourCalendarUnit
fromDate:fromDate toDate:toDate options:0];
return [difference hour];
}
问题是如果这样输入,
2016-03-09 07:58:39 +0000 (fromDateTime)
2016-03-09 09:07:44 +0000 (toDateTime),
始终相差 2 小时。实际上,它应该是 1 小时 10 分钟。结果,我只想展示1小时。有没有办法向上或向下舍入?
这个小的 NSCalendar 扩展应该能帮到您。
extension NSCalendar {
func hoursBetweenDates(startDate: NSDate, endDate: NSDate) -> Int {
let days = differenceInDates(startDate, endDate: endDate, unit: .Hour)
return days
}
func differenceInDates(startDate: NSDate, endDate: NSDate, unit: NSCalendarUnit) -> Int {
let startUnit = ordinalityOfUnit(unit, inUnit: .Era, forDate:startDate)
let endUnit = ordinalityOfUnit(unit, inUnit: .Era, forDate:endDate)
let difference = endUnit-startUnit
return difference
}
}
而Obj-C版本可以这样写:
@interface NSCalendar (Duration)
-(NSNumber *)hoursBetweenStartDate:(NSDate*)startDate andEndDate:(NSDate*) endDate;
@end
@implementation NSCalendar (Duration)
-(NSNumber *)hoursBetweenStartDate:(NSDate*)startDate andEndDate:(NSDate*) endDate {
NSUInteger startUnit = [self ordinalityOfUnit:NSCalendarUnitHour inUnit:NSCalendarUnitEra forDate:startDate];
NSUInteger endUnit = [self ordinalityOfUnit:NSCalendarUnitHour inUnit:NSCalendarUnitEra forDate:endDate];
return [NSNumber numberWithUnsignedInteger: (endUnit - startUnit)];
}
@end
你在比较之前只提取了小时部分(NSHourCalendarUnit
),这就是为什么它总是2(9 - 7).添加 NSMinuteCalendarUnit
结果将是 1:
+ (NSInteger)hoursBetweenDate:(NSDate*)fromDateTime andDate:(NSDate *)toDateTime
{
NSDate *fromDate;
NSDate *toDate;
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[calendar rangeOfUnit:NSHourCalendarUnit|NSMinuteCalendarUnit startDate:&fromDate
interval:NULL forDate:fromDateTime];
[calendar rangeOfUnit:NSHourCalendarUnit|NSMinuteCalendarUnit startDate:&toDate
interval:NULL forDate:toDateTime];
NSDateComponents *difference = [calendar components:NSHourCalendarUnit
fromDate:fromDate toDate:toDate options:0];
return [difference hour];
}
此外,如果您的目标是 iOS 8+,您应该使用 NSCalendarUnitHour
和 NSCalendarUnitMinute
,因为 NSHourCalendarUnit
和 NSMinuteCalendarUnit
已被弃用。
如果您只对日期之间的 "unformatted" 小时数感兴趣,可以使用 NSTimeInterval
并轻松计算。
+(int)fullHoursBetweenDate:(NSDate *)date1 andDate:(NSDate *)date2 {
NSTimeInterval interval = [date2 timeIntervalSinceDate:date1];
return (int)interval / 3600;
}
根据您的要求修改此功能
+(NSString*)timeDifference:(NSDate*)startDate endDate:(NSDate*)endDate{
NSDateComponents *components;
NSInteger days;
NSInteger hour;
NSInteger minutes;
NSString *strDuration;
components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute
fromDate: startDate toDate: endDate options: 0];
days = [components day];
hour=[components hour];
minutes=[components minute];
if(days>0){
if(days>1){
strDuration=[NSString stringWithFormat:@"%d days",days];
}
else{
strDuration=[NSString stringWithFormat:@"%d day",days];
}
return strDuration;
}
if(hour>0){
if(hour>1){
strDuration=[NSString stringWithFormat:@"%d hours",hour];
}
else{
strDuration=[NSString stringWithFormat:@"%d hour",hour];
}
return strDuration;
}
if(minutes>0){
if(minutes>1){
strDuration=[NSString stringWithFormat:@"%d minutes",minutes];
}
else{
strDuration=[NSString stringWithFormat:@"%d minute",minutes];
}
return strDuration;
}
return @"";
}
我这样写是为了计算时差
+ (NSInteger)hoursBetweenDate:(NSDate*)fromDateTime andDate:(NSDate *)toDateTime
{
NSDate *fromDate;
NSDate *toDate;
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[calendar rangeOfUnit:NSHourCalendarUnit startDate:&fromDate
interval:NULL forDate:fromDateTime];
[calendar rangeOfUnit:NSHourCalendarUnit startDate:&toDate
interval:NULL forDate:toDateTime];
NSDateComponents *difference = [calendar components:NSHourCalendarUnit
fromDate:fromDate toDate:toDate options:0];
return [difference hour];
}
问题是如果这样输入,
2016-03-09 07:58:39 +0000 (fromDateTime) 2016-03-09 09:07:44 +0000 (toDateTime),
始终相差 2 小时。实际上,它应该是 1 小时 10 分钟。结果,我只想展示1小时。有没有办法向上或向下舍入?
这个小的 NSCalendar 扩展应该能帮到您。
extension NSCalendar {
func hoursBetweenDates(startDate: NSDate, endDate: NSDate) -> Int {
let days = differenceInDates(startDate, endDate: endDate, unit: .Hour)
return days
}
func differenceInDates(startDate: NSDate, endDate: NSDate, unit: NSCalendarUnit) -> Int {
let startUnit = ordinalityOfUnit(unit, inUnit: .Era, forDate:startDate)
let endUnit = ordinalityOfUnit(unit, inUnit: .Era, forDate:endDate)
let difference = endUnit-startUnit
return difference
}
}
而Obj-C版本可以这样写:
@interface NSCalendar (Duration)
-(NSNumber *)hoursBetweenStartDate:(NSDate*)startDate andEndDate:(NSDate*) endDate;
@end
@implementation NSCalendar (Duration)
-(NSNumber *)hoursBetweenStartDate:(NSDate*)startDate andEndDate:(NSDate*) endDate {
NSUInteger startUnit = [self ordinalityOfUnit:NSCalendarUnitHour inUnit:NSCalendarUnitEra forDate:startDate];
NSUInteger endUnit = [self ordinalityOfUnit:NSCalendarUnitHour inUnit:NSCalendarUnitEra forDate:endDate];
return [NSNumber numberWithUnsignedInteger: (endUnit - startUnit)];
}
@end
你在比较之前只提取了小时部分(NSHourCalendarUnit
),这就是为什么它总是2(9 - 7).添加 NSMinuteCalendarUnit
结果将是 1:
+ (NSInteger)hoursBetweenDate:(NSDate*)fromDateTime andDate:(NSDate *)toDateTime
{
NSDate *fromDate;
NSDate *toDate;
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[calendar rangeOfUnit:NSHourCalendarUnit|NSMinuteCalendarUnit startDate:&fromDate
interval:NULL forDate:fromDateTime];
[calendar rangeOfUnit:NSHourCalendarUnit|NSMinuteCalendarUnit startDate:&toDate
interval:NULL forDate:toDateTime];
NSDateComponents *difference = [calendar components:NSHourCalendarUnit
fromDate:fromDate toDate:toDate options:0];
return [difference hour];
}
此外,如果您的目标是 iOS 8+,您应该使用 NSCalendarUnitHour
和 NSCalendarUnitMinute
,因为 NSHourCalendarUnit
和 NSMinuteCalendarUnit
已被弃用。
如果您只对日期之间的 "unformatted" 小时数感兴趣,可以使用 NSTimeInterval
并轻松计算。
+(int)fullHoursBetweenDate:(NSDate *)date1 andDate:(NSDate *)date2 {
NSTimeInterval interval = [date2 timeIntervalSinceDate:date1];
return (int)interval / 3600;
}
根据您的要求修改此功能
+(NSString*)timeDifference:(NSDate*)startDate endDate:(NSDate*)endDate{
NSDateComponents *components;
NSInteger days;
NSInteger hour;
NSInteger minutes;
NSString *strDuration;
components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute
fromDate: startDate toDate: endDate options: 0];
days = [components day];
hour=[components hour];
minutes=[components minute];
if(days>0){
if(days>1){
strDuration=[NSString stringWithFormat:@"%d days",days];
}
else{
strDuration=[NSString stringWithFormat:@"%d day",days];
}
return strDuration;
}
if(hour>0){
if(hour>1){
strDuration=[NSString stringWithFormat:@"%d hours",hour];
}
else{
strDuration=[NSString stringWithFormat:@"%d hour",hour];
}
return strDuration;
}
if(minutes>0){
if(minutes>1){
strDuration=[NSString stringWithFormat:@"%d minutes",minutes];
}
else{
strDuration=[NSString stringWithFormat:@"%d minute",minutes];
}
return strDuration;
}
return @"";
}