Comment calculer les jours compris entre le 1er janvier 2010 et le 3 février 2010 (par exemple)?
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);
N'oubliez pas que les objets NSDate
représentent les moments exacts du temps, ils ne sont associés à aucune information de fuseau horaire. Lorsque vous convertissez une chaîne en date avec, par exemple, NSDateFormatter
, la NSDateFormatter
convertit l'heure à partir du fuseau horaire configuré. Par conséquent, le nombre de secondes entre deux objets NSDate
sera toujours indépendant du temps.
De plus, cette documentation spécifie que la mise en œuvre de l'heure par Cocoa ne prend pas en compte les secondes intercalaires. Par conséquent, si vous avez besoin d'une telle précision, vous devrez lancer votre propre mise en œuvre.
Vous voudrez peut-être utiliser quelque chose comme ceci:
NSDateComponents *components;
NSInteger days;
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit
fromDate: startDate toDate: endDate options: 0];
days = [components day];
Je crois que cette méthode rend compte de situations telles que les dates qui couvrent un changement d’heure avancée.
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds
où date1
et date2
sont des noms de NSDate
'.
Notez également la définition de NSTimeInterval
:
typedef double NSTimeInterval;
Commander ceci ceci. Il prend en compte l’heure avancée, année bissextile, car il utilise le calendrier iOS pour calculer. Vous pouvez modifier la chaîne et les conditions pour inclure les minutes avec les heures et les jours.
+(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 @"";
}
Swift 4
Essayez ceci et voyez (plage de dates avec 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)
Avec Swift 5 et iOS 12, vous pouvez utiliser l’un des deux moyens suivants pour déterminer la différence entre deux dates en jours, selon vos besoins.
Calendar
's dateComponents(_:from:to:)
methodimport 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
's string(from:to:)
methodimport 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")
Vous pouvez trouver la différence en convertissant la date en secondes et prendre un intervalle de temps depuis 1970 pour cela, puis vous pouvez trouver la différence entre deux dates.