So berechnen Sie die Zeit in Stunden zwischen zwei Daten in iOS


103

Wie kann ich die in Stunden verstrichene Zeit zwischen iOS (möglicherweise an verschiedenen Tagen) in zwei Stunden berechnen?


1
Eine andere Möglichkeit ist die Verwendung NSCalendarder -components:fromDate:toDate:options:Methode.
Thomas Müller

Ich glaube nicht, dass dies Ihnen eine absolute Anzahl von Stunden geben wird. Sie erhalten nur einen Wert zwischen 0 und 24, bei dem Sie sich auf die Komponenten Tag, Monat und Jahr verlassen müssen, um das vollständige Zeitintervall zu erhalten.
Codeperson

Ich habe das getestet und es funktioniert einwandfrei. Mit Datum vom 1. Januar 2012 und Datum 4. Januar 2012 wurden 96 Stunden zurückgegeben.
Thomas Müller

Code posten Thomas? Bei manchen funktioniert es nicht.
John Riselvato

Antworten:


170

Die NSDate- Funktion timeIntervalSinceDate: gibt Ihnen die Differenz von zwei Daten in Sekunden an.

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

Weitere Informationen finden Sie in der Apple-Referenzbibliothek unter http://developer.apple.com/library/mac/navigation/. Wenn Sie Xcode verwenden, wählen Sie einfach Hilfe / Dokumentation aus dem Menü.

Siehe: So konvertieren Sie ein nstimeinterval-Sekunden-in-Minuten

--edit: In der Antwort von ÐąrέÐέvil unten finden Sie Informationen zum korrekten Umgang mit Sommerzeit / Schaltsekunden


2
Und was passiert, wenn die Daten / Zeiten den Übergang für die Sommerzeit überschreiten?
Abizern

2
@Abizern: Danke, ich habe diese Fälle nicht berücksichtigt, als ich die Frage beantwortet habe. Ich habe auf die Antwort von ÐąrέÐέvil
Akusete

Ich habe Zeitfenster wie 4:50:30, h: m: si muss diese Zeit von 12:30:20 subtrahieren, wie ich das machen werde
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

Ändern Sie die benötigten Komponenten in Tag, Stunde oder Minute, je nachdem, welchen Unterschied Sie möchten. Wenn NSDayCalendarUnitdiese Option ausgewählt ist, wird die Anzahl der Tage zwischen zwei Daten ähnlich für NSHourCalendarUnitund zurückgegebenNSMinuteCalendarUnit

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!

Welchen Wert akzeptiert dateWithTimeIntervalSince1970? Ich glaube, Sie haben das Datum 2012-06-22 in 1340323201 konvertiert. Bitte korrigieren Sie mich.
Jeet

Ich arbeite nicht für mich. Der Diff-Wert wurde als 9223372036854775807 angegeben. Ist er in Millisekunden angegeben?
Kirti Nikam

Swift 4.2. Anstelle von [.hour] können Sie 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
Nein, tu das nicht. Nicht alle Stunden haben 3600 Sekunden. Nicht alle Tage haben 24 Stunden.
rmaddy

5
Das ist völlig falsch. Berücksichtigt keine Schaltsekunden, Sommerzeit. Bitte erfinden Sie das Rad nicht neu. Verwenden Sie nur die mit iOS bereitgestellten APIs wie NSDateComponents.
Juan Catalan

5

Kasse: Es kümmert sich um die Sommerzeit, Schaltjahr, da es iOS-Kalender zur Berechnung verwendet. Sie können die Zeichenfolge und die Bedingungen so ändern, dass sie Minuten mit Stunden und Tagen enthalten.

+(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 @"";
}

Es zeigt nicht mehr als 12 Stunden Unterschied. Wenn ich einige Bedingungen nach 23 Stunden überprüfen möchte, wie kann ich dann einen Unterschied von 23 Stunden zwischen den Zeiten feststellen?
Moxarth

Es gibt ein falsches Zeitintervall und funktioniert bei mir nicht.
Arvind Patel

3

Für diejenigen, die Swift 3 und höher verwenden,

    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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.