How to calculate time in hours between two dates in iOS

后端 未结 5 1130
野性不改
野性不改 2020-11-29 19:24

How can I calculate the time elapsed in hours between two times (possibly occurring on different days) in iOS?

相关标签:
5条回答
  • 2020-11-29 19:45

    The NSDate function timeIntervalSinceDate: will give you the difference of two dates in seconds.

     NSDate* date1 = someDate;
     NSDate* date2 = someOtherDate;
     NSTimeInterval distanceBetweenDates = [date1 timeIntervalSinceDate:date2];
     double secondsInAnHour = 3600;
     NSInteger hoursBetweenDates = distanceBetweenDates / secondsInAnHour;
    

    See, the apple reference library http://developer.apple.com/library/mac/navigation/ or if you are using Xcode just select help/documentation from the menu.

    See: how-to-convert-an-nstimeinterval-seconds-into-minutes

    --edit: See ÐąrέÐέvil's answer below for correctly handling daylight savings/leap seconds

    0 讨论(0)
  • 2020-11-29 19:49
    -(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;
    }
    
    0 讨论(0)
  • 2020-11-29 19:49

    For those who use swift 3 and above,

        let dateString1 = "2018-03-15T14:20:00.000Z"
        let dateString2 = "2018-03-20T14:20:00.000Z"
    
        let Dateformatter = DateFormatter()
        Dateformatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    
        let date1 = Dateformatter.date(from: dateString1)
        let date2 = Dateformatter.date(from: dateString2)
    
        let distanceBetweenDates: TimeInterval? = date2?.timeIntervalSince(date1!)
        let secondsInAnHour: Double = 3600
        let secondsInDays: Double = 86400
        let secondsInWeek: Double = 604800
    
        let hoursBetweenDates = Int((distanceBetweenDates! / secondsInAnHour))
        let daysBetweenDates = Int((distanceBetweenDates! / secondsInDays))
        let weekBetweenDates = Int((distanceBetweenDates! / secondsInWeek))
    
        print(weekBetweenDates,"weeks")//0 weeks
        print(daysBetweenDates,"days")//5 days
        print(hoursBetweenDates,"hours")//120 hours
    
    0 讨论(0)
  • 2020-11-29 19:56
    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
    

    Change needed components to day, hour or minute, which difference you want. If NSDayCalendarUnit is selected then it'll return the number of days between two dates similarly for NSHourCalendarUnit and NSMinuteCalendarUnit

    Swift 4 version

    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!
    
    0 讨论(0)
  • 2020-11-29 20:04

    Checkout : It takes care of daylight saving, leap year as it used iOS calendar to calculate. You can change the string and conditions to includes minutes with hours and days.

    +(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 @"";
    }
    
    0 讨论(0)
提交回复
热议问题