如何计算iOS中两个日期之间的小时数

ios*_*kie 97 iphone ios

如何计算iOS中两次(可能在不同日期发生)之间的小时数?

Aku*_*ete 167

NSDate的功能timeIntervalSinceDate:给你两个日期的秒差.

 NSDate* date1 = someDate;
 NSDate* date2 = someOtherDate;
 NSTimeInterval distanceBetweenDates = [date1 timeIntervalSinceDate:date2];
 double secondsInAnHour = 3600;
 NSInteger hoursBetweenDates = distanceBetweenDates / secondsInAnHour;
Run Code Online (Sandbox Code Playgroud)

请参阅苹果参考库 http://developer.apple.com/library/mac/navigation/ 或者如果您使用的是Xcode,只需从菜单中选择帮助/文档即可.

请参阅:how-to-convert-an-nstimeinterval-seconds-into-minutes

--edit:请参阅下面的ÐąrέÐέvil的答案,以正确处理夏令时/闰秒

  • 如果日期/时间跨越夏令时的过渡会怎样? (2认同)
  • @Abizern:谢谢,当我回答这个问题时,我并没有考虑这些情况.我通过ÐąrέÐέvil与答案联系起来 (2认同)

aah*_*ali 80

NSCalendar *c = [NSCalendar currentCalendar];
NSDate *d1 = [NSDate date];
NSDate *d2 = [NSDate dateWithTimeIntervalSince1970:1340323201];//2012-06-22
NSDateComponents *components = [c components:NSHourCalendarUnit fromDate:d2 toDate:d1 options:0];
NSInteger diff = components.minute;

NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit
Run Code Online (Sandbox Code Playgroud)

将所需组件更改为日,小时或分钟,这是您想要的差异.如果NSDayCalendarUnit选中,那么它将返回两个日期之间的天数,类似于NSHourCalendarUnitNSMinuteCalendarUnit

Swift 4版

let cal = Calendar.current
let d1 = Date()
let d2 = Date.init(timeIntervalSince1970: 1524787200) // April 27, 2018 12:00:00 AM
let components = cal.dateComponents([.hour], from: d2, to: d1)
let diff = components.hour!
Run Code Online (Sandbox Code Playgroud)


小智 19

-(NSMutableString*) timeLeftSinceDate: (NSDate *) dateT {

    NSMutableString *timeLeft = [[NSMutableString alloc]init];

    NSDate *today10am =[NSDate date];

    NSInteger seconds = [today10am timeIntervalSinceDate:dateT];

    NSInteger days = (int) (floor(seconds / (3600 * 24)));
    if(days) seconds -= days * 3600 * 24;

    NSInteger hours = (int) (floor(seconds / 3600));
    if(hours) seconds -= hours * 3600;

    NSInteger minutes = (int) (floor(seconds / 60));
    if(minutes) seconds -= minutes * 60;

    if(days) {
        [timeLeft appendString:[NSString stringWithFormat:@"%ld Days", (long)days*-1]];
    }

    if(hours) {
        [timeLeft appendString:[NSString stringWithFormat: @"%ld H", (long)hours*-1]];
    }

    if(minutes) {
        [timeLeft appendString: [NSString stringWithFormat: @"%ld M",(long)minutes*-1]];
    }

    if(seconds) {
        [timeLeft appendString:[NSString stringWithFormat: @"%lds", (long)seconds*-1]];
    }

    return timeLeft;
}
Run Code Online (Sandbox Code Playgroud)

  • 不,不要这样做.并非所有小时都有3600秒.并非所有日子都有24小时. (9认同)
  • 这是完全错误的.不占闰秒,节省日光时间.请不要重新发明轮子只需使用iOS提供的API,如NSDateComponents. (5认同)

Ank*_*ain 6

结帐:它使用iOS日历计算,它负责夏令时,闰年.您可以将字符串和条件更改为包含小时和天的分钟数.

+(NSString*)remaningTime:(NSDate*)startDate endDate:(NSDate*)endDate {

    NSDateComponents *components;
    NSInteger days;
    NSInteger hour;
    NSInteger minutes;
    NSString *durationString;

    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) {
            durationString = [NSString stringWithFormat:@"%d days", days];
        }
        else {
            durationString = [NSString stringWithFormat:@"%d day", days];
        }
        return durationString;
    }

    if (hour > 0) {

        if (hour > 1) {
            durationString = [NSString stringWithFormat:@"%d hours", hour];
        }
        else {
            durationString = [NSString stringWithFormat:@"%d hour", hour];
        }
        return durationString;
    }

    if (minutes > 0) {

        if (minutes > 1) {
            durationString = [NSString stringWithFormat:@"%d minutes", minutes];
        }
        else {
            durationString = [NSString stringWithFormat:@"%d minute", minutes];
        }
        return durationString;
    }

    return @"";
}
Run Code Online (Sandbox Code Playgroud)