Wie kann ich die Differenz zwischen zwei Daten berechnen?

115

Wie kann ich die Tage zwischen dem 1. Januar 2010 und (zum Beispiel) dem 3. Februar 2010 berechnen?

Frederik Heyninck
quelle

Antworten:

237
NSDate *date1 = [NSDate dateWithString:@"2010-01-01 00:00:00 +0000"];
NSDate *date2 = [NSDate dateWithString:@"2010-02-03 00:00:00 +0000"];

NSTimeInterval secondsBetween = [date2 timeIntervalSinceDate:date1];

int numberOfDays = secondsBetween / 86400;

NSLog(@"There are %d days in between the two dates.", numberOfDays);

BEARBEITEN:

Denken Sie daran, dass NSDateObjekte exakte Zeitmomente darstellen und keine Zeitzoneninformationen zugeordnet sind. Wenn Sie eine Zeichenfolge in ein Datum konvertieren mit einem beispielsweise NSDateFormatter, die NSDateFormatterKonvertiten der Zeit von der konfigurierten Zeitzone. Daher NSDatewird immer die Anzahl der Sekunden zwischen zwei Objekten angegeben zeitzonenunabhängig.

Darüber hinaus wird in dieser Dokumentation angegeben, dass die Implementierung der Zeit durch Cocoa keine Schaltsekunden berücksichtigt. Wenn Sie also eine solche Genauigkeit benötigen, müssen Sie Ihre eigene Implementierung ausführen.

Dreamlax
quelle
5
@RalucaGurau: 86400 ist die Anzahl der Sekunden pro Tag (dh 60 Sekunden, mal 60 Minuten, mal 24 Stunden). Es hat nichts mit dem Monat zu tun.
Dreamlax
18
Nicht alle Tage haben 86400 Sekunden. Für ein triviales Beispiel ist das in Ordnung, aber in der realen Welt keine gute Idee. Sommerzeitänderungen, Schaltsekunden usw. können alles durcheinander bringen. NSCalendar kann Ihnen sagen, wie viele Sekunden an einem bestimmten Tag sind.
NeilInglis
2
@muthukumar: Nicht unter iOS, die Methode ist nur unter Mac OS X verfügbar. Diese Frage ist markiert cocoa und nicht cocoa-touchso, dass diese Antwort nur für Mac OS X gilt.
dreamlax
1
Die Anzahl der Tage zwischen zwei beliebigen Zeitpunkten beträgt immer 86400. Ob sich Menschen täuschen, eine Stunde früher als normal aufzuwachen oder nicht, spielt keine Rolle für die Tatsache, dass ein Tag 86400 Sekunden lang ist (ohne Berücksichtigung des Sprungs) Sekunden)
Dreamlax
1
Ich möchte nur hinzufügen, dass Sie, wenn Sie diese +0000 am Ende nicht haben, Nulldaten und einen Wert von 0 immer im Diff erhalten, egal was passiert. Fallen Sie also nicht in diese Falle.
Volomike
84

Möglicherweise möchten Sie Folgendes verwenden:

NSDateComponents *components;
NSInteger days;

components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit 
        fromDate: startDate toDate: endDate options: 0];
days = [components day];

Ich glaube, diese Methode berücksichtigt Situationen wie Daten, die eine Änderung der Sommerzeit umfassen.

Casey Fleser
quelle
2
Gibt es eine einfache Möglichkeit, die Zeit für die angegebenen Daten zu ignorieren?
Mihai Timar
kann entsprechend für andere Kalendereinheiten geändert werden :), die für die Jahreseinheit verwendet werden.
technisch versierte
NSDateObjekte sind bereits zeitzonenunabhängig. Die Zeitzoneninformationen werden entfernt, wenn Daten mit z. B. analysiert werden NSDateFormatter, sodass NSDateObjekte genaue Zeitpunkte darstellen. Wenn Sie also bereits startDateund haben endDate, sind diese beiden Objekte x Sekunden voneinander entfernt. Zeitzonen haben nichts damit zu tun.
Dreamlax
@ Benjamin: Warum sagst du das?
Dreamlax
Dreamlax, deine Antwort ist falsch. Schlicht und einfach. Berechnen Sie die Anzahl der Tage zwischen der Standardzeit am 1. Januar um 12.00 Uhr und der Tageszeit am 1. April um 12.00 Uhr, und Ihre Formel funktioniert nicht. Es ist eine faule Formel und Entwickler sollten das NSDateComponents-Objekt verwenden, um dies zu berechnen.
Rickster
25
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds

wo date1und date2sindNSDate .

Beachten Sie auch die Definition von NSTimeInterval:

typedef double NSTimeInterval;
Chetan
quelle
Beachten Sie, dass NSTimeInterval wirklich ein Double ist, sodass Sie es wie jede andere Zahl verwenden können.
Kendall Helmstetter Gelner
19

Kasse dies aus. Es kümmert sich um die Sommerzeit und das Schaltjahr, da der iOS-Kalender zur Berechnung verwendet wurde. 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
Diese Methode ist die perfekte Methode zur Berechnung der Zeitdifferenz.
Moxarth
nur können Sie elseif mit all diesen if-Bedingungen behalten. Andernfalls wird nur ein Zeitformat angezeigt.
Moxarth
3

Mit Swift 5 und iOS 12 können Sie je nach Bedarf eine der beiden folgenden Methoden verwenden, um den Unterschied zwischen zwei Daten in Tagen zu ermitteln.


# 1. Mit Calendarder dateComponents(_:from:to:)Methode von

import Foundation

let calendar = Calendar.current

let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!

let dateComponents = calendar.dateComponents([Calendar.Component.day], from: startDate, to: endDate)

print(dateComponents) // prints: day: 1621 isLeapMonth: false
print(String(describing: dateComponents.day)) // prints: Optional(1621)

# 2. Mit DateComponentsFormatterder string(from:to:)Methode von

import Foundation

let calendar = Calendar.current

let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.allowedUnits = [NSCalendar.Unit.day]

let elapsedTime = formatter.string(from: startDate, to: endDate)
print(String(describing: elapsedTime)) // prints: Optional("1,621 days")
Imanou Petit
quelle
1

Swift 4
Versuchen Sie dies und sehen Sie (Datumsbereich mit String):

// Start & End date string
let startingAt = "01/01/2018"
let endingAt = "08/03/2018"

// Sample date formatter
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"

// start and end date object from string dates
var startDate = dateFormatter.date(from: startingAt) ?? Date()
let endDate = dateFormatter.date(from: endingAt) ?? Date()


// Actual operational logic
var dateRange: [String] = []
while startDate <= endDate {
    let stringDate = dateFormatter.string(from: startDate)
    startDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate) ?? Date()
    dateRange.append(stringDate)
}

print("Resulting Array - \(dateRange)")

Swift 3

var date1 = Date(string: "2010-01-01 00:00:00 +0000")
var date2 = Date(string: "2010-02-03 00:00:00 +0000")
var secondsBetween: TimeInterval = date2.timeIntervalSince(date1)
var numberOfDays: Int = secondsBetween / 86400
print(numberOfDays)
Krunal
quelle
Nicht alle Tage haben so viele Sekunden.
Pavan
@Pavan - Sie können gerne Ihre Eingaben teilen, indem Sie diese Antwort aktualisieren und verbessern.
Krunal
Um es besser zu machen, müsste ich Ihre gesamte Antwort umschreiben. In diesem Fall kann sie auch gelöscht werden, da dies dieselbe Lösung wie die obige Antwort ist, bei der keine fest codierten Werte verwendet werden :)
Pavan,
0

Sie können den Unterschied ermitteln, indem Sie das Datum in Sekunden umrechnen und dafür das Zeitintervall seit 1970 verwenden. Anschließend können Sie den Unterschied zwischen zwei Datumsangaben ermitteln.

Himanshu Bhatia
quelle
wenn zwei Daten direkt miteinander berechnet werden können (unter der Annahme des gleichen Zeitbereichs). Gibt es einen bestimmten Grund, beide Daten seit 1970 zuerst zu berechnen und dann den Unterschied zu finden?
Adeel
0

Um den Unterschied zu ermitteln, müssen Sie das aktuelle Datum und das Datum in der Zukunft ermitteln. Im folgenden Fall habe ich 2 Tage als Beispiel für das zukünftige Datum verwendet. Berechnet von:

2 days* 24 hours* 60 minutes* 60 seconds. Wir erwarten, dass die Anzahl der Sekunden in 2 Tagen 172.800 beträgt.

// Set the current and future date
let now = Date()
let nowPlus2Days = Date(timeInterval: 2*24*60*60, since: now)

// Get the number of seconds between these two dates
let secondsInterval = DateInterval(start: now, end: nowPlus2Days).duration

print(secondsInterval) // 172800.0
Roi Zakai
quelle
1
Bitte posten Sie nicht nur Code als Antwort, sondern geben Sie auch eine Erklärung, was Ihr Code tut und wie er das Problem der Frage löst. Antworten mit einer Erklärung sind normalerweise von höherer Qualität und ziehen eher positive Stimmen an.
Mark Rotteveel