web-dev-qa-db-fra.com

Comment puis-je calculer la différence entre deux dates?

Comment calculer les jours compris entre le 1er janvier 2010 et le 3 février 2010 (par exemple)?

101
Frederik Heyninck
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);

MODIFIER:

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.

224
dreamlax

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.

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

date1 et date2 sont des noms de NSDate '.

Notez également la définition de NSTimeInterval:

typedef double NSTimeInterval;
23
Chetan

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

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

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.


#1. Utilisation de Calendar 's dateComponents(_:from:to:) method

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. Utilisation de DateComponentsFormatter 's string(from:to:) method

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

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.

0
Himanshu Bhatia