Comment puis-je calculer les jours entre le 1er janvier 2010 et (par exemple) le 3 février 2010?
Comment puis-je calculer les jours entre le 1er janvier 2010 et (par exemple) le 3 février 2010?
Réponses:
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 NSDate
objets représentent des moments exacts, ils n'ont aucune information de fuseau horaire associée. Lorsque vous convertissez une chaîne en une date en utilisant par exemple un NSDateFormatter
, le NSDateFormatter
convertit l'heure à partir du fuseau horaire configuré. Par conséquent, le nombre de secondes entre deux NSDate
objets sera toujours indépendant du fuseau horaire.
De plus, cette documentation spécifie que l'implémentation du temps par Cocoa ne tient pas compte des secondes intercalaires, donc si vous avez besoin d'une telle précision, vous devrez lancer votre propre implémentation.
cocoa
et pas cocoa-touch
si cette réponse ne s'applique qu'à Mac OS X.
Vous pouvez 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 tient compte de situations telles que les dates qui couvrent un changement d'heure d'été.
NSDate
les objets sont déjà indépendants du fuseau horaire. Les informations de fuseau horaire sont supprimées lors de l'analyse des dates avec par exemple NSDateFormatter
, afin que les NSDate
objets représentent des moments exacts dans le temps. Par conséquent, si vous avez déjà startDate
et endDate
, ces deux objets seront séparés de x secondes. Les fuseaux horaires n'auront rien à voir avec cela.
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds
où date1
et date2
sont NSDate
.
Notez également la définition de NSTimeInterval
:
typedef double NSTimeInterval;
Vérifiez ceci. Il prend en charge l'heure d'été, année bissextile, car il utilisait 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 @"";
}
Avec Swift 5 et iOS 12, selon vos besoins, vous pouvez utiliser l'une des deux méthodes suivantes pour trouver la différence entre deux dates en jours.
Calendar
la dateComponents(_:from:to:)
méthode deimport 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
la string(from:to:)
méthode deimport 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
Essayez ceci et voyez (plage de dates avec chaîne):
// 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)
Vous pouvez trouver la différence en convertissant la date en secondes et prendre l'intervalle de temps depuis 1970 pour cela, puis vous pouvez trouver la différence entre deux dates.
Pour trouver la différence, vous devez obtenir la date actuelle et la date future. Dans le cas suivant, j'ai utilisé 2 jours pour un exemple de date future. Calculé par:
2 days
* 24 hours
* 60 minutes
* 60 seconds
. Nous prévoyons que le nombre de secondes en 2 jours sera de 172 800.
// 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