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?

iosrookie
quelle
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

Akusete
quelle
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!
aahsanali
quelle
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;
}
Ashish Patel
quelle
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 @"";
}
Ankish Jain
quelle
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
John Raja
quelle