iOS에서 두 날짜 사이의 시간을 시간으로 계산하는 방법


103

iOS에서 두 시간 (다른 날에 발생할 수 있음) 사이에 경과 된 시간을 어떻게 계산할 수 있습니까?


1
또 다른 옵션은 NSCalendar-components:fromDate:toDate:options:방법 을 사용 하는 것입니다.
Thomas Müller

나는 이것이 당신에게 절대적인 시간을 줄 것이라고 믿지 않습니다. 전체 시간 간격을 얻으려면 일, 월 및 연도 구성 요소에 의존해야하는 0-24의 값만 제공합니다.
codeperson

나는 이것을 테스트했고 잘 작동합니다. fromDate 1 / Jan / 2012 및 toDate 4 / Jan / 2012에서는 96 시간이 반환되었습니다.
Thomas Müller

코드 게시하기 Thomas? 일부에게는 작동하지 않습니다.
John Riselvato

답변:


171

있는 NSDate의 기능 timeIntervalSinceDate은 : 당신이 초 두 날짜의 차이를 줄 것이다.

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

의 참조 사과 참조 라이브러리 http://developer.apple.com/library/mac/navigation/ 당신이 엑스 코드는 단지 선택 사용하는 경우 또는 지원 / 설명서 메뉴에서.

참조 : n -nstimeinterval-seconds를 분으로 변환하는 방법

--edit : 일광 절약 시간 / 윤초를 올바르게 처리하려면 아래 ÐąrέÐέvil의 답변을 참조하십시오.


2
날짜 / 시간이 일광 절약 시간 제로 전환되면 어떻게됩니까?
Abizern 2013

2
@Abizern : 고마워요, 질문에 답했을 때 그 사건을 고려하지 않았습니다. 나는 ÐąrέÐέvil에 의해 대답에 연결 한
Akusete

4:50:30과 같은 시간 슬롯이 있습니다. h : m : si는 12:30:20에서이 시간을 빼야합니다.
AyAz

90
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

필요한 구성 요소를 원하는 차이로 일, 시간 또는 분으로 변경하십시오. NSDayCalendarUnit를 선택 하면 NSHourCalendarUnit및에 대해 비슷한 두 날짜 사이의 일 수를 반환합니다.NSMinuteCalendarUnit

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!

dateWithTimeIntervalSince1970이 수락하는 값은 무엇입니까? 나는 당신이 2012-06-22 날짜를 1340323201로 변환했다고 믿습니다. 저를 수정하십시오.
Jeet

나를 위해 일하지 않습니다. diff 값은 9223372036854775807입니다. 밀리 초 단위입니까?
Kirti Nikam

Swift 4.2. [.hour] 대신 Set <Calendar.Component> ([. hour])
IvanPavliuk

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;
}

9
아니요, 이러지 마세요. 모든 시간에 3600 초가있는 것은 아닙니다. 하루 종일 24 시간이있는 것은 아닙니다.
rmaddy

5
이것은 완전히 잘못된 것입니다. 윤초, 일광 절약 시간을 고려하지 않습니다. NSDateComponents와 같이 iOS와 함께 제공되는 API를 사용하여 바퀴를 재발 명하지 마십시오.
Juan Catalan

5

체크 아웃 : 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 @"";
}

12 시간 이상 차이가 나지 않습니다. 23 시간에 어떤 조건을 확인하고 싶다면 어떻게 23 시간의 시간 차이를 얻을 수 있습니까?
Moxarth

나를 위해 작동하지 않는 잘못된 시간 간격을 제공합니다.
Arvind Patel

3

스위프트 3 이상을 사용하시는 분들은

    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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.