Wie kann ich die Tage zwischen dem 1. Januar 2010 und (zum Beispiel) dem 3. Februar 2010 berechnen?
Wie kann ich die Tage zwischen dem 1. Januar 2010 und (zum Beispiel) dem 3. Februar 2010 berechnen?
Antworten:
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);
Denken Sie daran, dass NSDate
Objekte exakte Zeitmomente darstellen und keine Zeitzoneninformationen zugeordnet sind. Wenn Sie eine Zeichenfolge in ein Datum konvertieren mit einem beispielsweise NSDateFormatter
, die NSDateFormatter
Konvertiten der Zeit von der konfigurierten Zeitzone. Daher NSDate
wird 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.
cocoa
und nicht cocoa-touch
so, dass diese Antwort nur für Mac OS X gilt.
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.
NSDate
Objekte sind bereits zeitzonenunabhängig. Die Zeitzoneninformationen werden entfernt, wenn Daten mit z. B. analysiert werden NSDateFormatter
, sodass NSDate
Objekte genaue Zeitpunkte darstellen. Wenn Sie also bereits startDate
und haben endDate
, sind diese beiden Objekte x Sekunden voneinander entfernt. Zeitzonen haben nichts damit zu tun.
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds
wo date1
und date2
sindNSDate
.
Beachten Sie auch die Definition von NSTimeInterval
:
typedef double NSTimeInterval;
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 @"";
}
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.
Calendar
der dateComponents(_:from:to:)
Methode vonimport 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)
DateComponentsFormatter
der string(from:to:)
Methode vonimport 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")
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)
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.
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