webentwicklung-frage-antwort-db.com.de

Wie kann ich die Differenz zwischen zwei Terminen berechnen?

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

101
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 NSDate-Objekte exakte Zeitpunkte repräsentieren, denen keine Zeitzoneninformationen zugeordnet sind. Wenn Sie eine Zeichenfolge in ein Datum konvertieren, verwenden Sie z. NSDateFormatter konvertiert die NSDateFormatter die Zeit aus der konfigurierten Zeitzone. Daher ist die Anzahl der Sekunden zwischen zwei NSDate-Objekten always zeitzonenunabhängig.

Darüber hinaus gibt diese Dokumentation an, dass Cocoas Implementierung der Zeit keine Schaltsekunden berücksichtigt. Wenn Sie eine solche Genauigkeit benötigen, müssen Sie Ihre eigene Implementierung ausführen.

224
dreamlax

Vielleicht möchten Sie so etwas 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 Datumsangaben, die eine Änderung der Sommerzeit umfassen.

79
Casey Fleser
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds

dabei sind date1 und date2NSDate.

Beachten Sie auch die Definition von NSTimeInterval:

typedef double NSTimeInterval;
23
Chetan

Überprüfen Sie dies aus. Es berücksichtigt die Sommerzeit, das Schaltjahr, da es den iOS-Kalender zum Berechnen verwendet.

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

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)
1
Krunal

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


# 1. Verwenden der Calendar-Methode dateComponents(_:from:to:)

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. Verwenden der DateComponentsFormatter-Methode string(from:to:)

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")
0
Imanou Petit

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.

0
Himanshu Bhatia