Comment calculer le temps écoulé en heures entre deux moments (pouvant survenir à des jours différents) dans iOS ?
Et que se passe-t-il si les dates/heures croisent la transition pour l'heure d'été ?
Comment calculer le temps écoulé en heures entre deux moments (pouvant survenir à des jours différents) dans iOS ?
El NSDate fonction timeIntervalSinceDate : vous donnera la différence entre deux dates en secondes.
NSDate* date1 = someDate;
NSDate* date2 = someOtherDate;
NSTimeInterval distanceBetweenDates = [date1 timeIntervalSinceDate:date2];
double secondsInAnHour = 3600;
NSInteger hoursBetweenDates = distanceBetweenDates / secondsInAnHour;
Voir, le bibliothèque de référence de la pomme http://developer.apple.com/library/mac/navigation/ ou si vous utilisez Xcode, sélectionnez simplement aide/documentation dans le menu.
Voir : comment-convertir-un-intervalle-de-temps-secondes-en-minutes
--edit : Voir La réponse de ÐrÐvil ci-dessous pour gérer correctement l'heure d'été et les secondes intercalaires.
@Abizern : Merci, je n'envisageais pas ces cas lorsque j'ai répondu à la question. J'ai mis un lien vers la réponse de ÐrÐvil.
NSCalendar *c = [NSCalendar currentCalendar];
NSDate *d1 = [NSDate date];
NSDate *d2 = [NSDate dateWithTimeIntervalSince1970:1340323201];//2012-06-22
NSDateComponents *components = [c components:NSHourCalendarUnit fromDate:d2 toDate:d1 options:0];
NSInteger diff = components.minute;
NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit
Changez les composants nécessaires en jour, heure ou minute, selon la différence que vous voulez. Si NSDayCalendarUnit
est sélectionné, il renverra le nombre de jours entre deux dates, de la même manière que pour l'option NSHourCalendarUnit
y NSMinuteCalendarUnit
Version Swift 4
let cal = Calendar.current
let d1 = Date()
let d2 = Date.init(timeIntervalSince1970: 1524787200) // April 27, 2018 12:00:00 AM
let components = cal.dateComponents([.hour], from: d2, to: d1)
let diff = components.hour!
Quelle valeur dateWithTimeIntervalSince1970 accepte-t-elle ? Je crois que vous avez converti la date 2012-06-22 en 1340323201. Veuillez me corriger.
Ne fonctionne pas pour moi. J'ai obtenu une valeur de différence de 9223372036854775807. Est-ce que c'est en millisecondes ?
-(NSMutableString*) timeLeftSinceDate: (NSDate *) dateT {
NSMutableString *timeLeft = [[NSMutableString alloc]init];
NSDate *today10am =[NSDate date];
NSInteger seconds = [today10am timeIntervalSinceDate:dateT];
NSInteger days = (int) (floor(seconds / (3600 * 24)));
if(days) seconds -= days * 3600 * 24;
NSInteger hours = (int) (floor(seconds / 3600));
if(hours) seconds -= hours * 3600;
NSInteger minutes = (int) (floor(seconds / 60));
if(minutes) seconds -= minutes * 60;
if(days) {
[timeLeft appendString:[NSString stringWithFormat:@"%ld Days", (long)days*-1]];
}
if(hours) {
[timeLeft appendString:[NSString stringWithFormat: @"%ld H", (long)hours*-1]];
}
if(minutes) {
[timeLeft appendString: [NSString stringWithFormat: @"%ld M",(long)minutes*-1]];
}
if(seconds) {
[timeLeft appendString:[NSString stringWithFormat: @"%lds", (long)seconds*-1]];
}
return timeLeft;
}
Non, ne le faites pas. Toutes les heures n'ont pas 3600 secondes. Tous les jours n'ont pas 24 heures.
Checkout : Il prend en charge l'heure d'été, l'année bissextile car il utilise le calendrier iOS pour calculer. Vous pouvez changer 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 @"";
}
Pour ceux qui utilisent swift 3 et plus,
let dateString1 = "2018-03-15T14:20:00.000Z"
let dateString2 = "2018-03-20T14:20:00.000Z"
let Dateformatter = DateFormatter()
Dateformatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let date1 = Dateformatter.date(from: dateString1)
let date2 = Dateformatter.date(from: dateString2)
let distanceBetweenDates: TimeInterval? = date2?.timeIntervalSince(date1!)
let secondsInAnHour: Double = 3600
let secondsInDays: Double = 86400
let secondsInWeek: Double = 604800
let hoursBetweenDates = Int((distanceBetweenDates! / secondsInAnHour))
let daysBetweenDates = Int((distanceBetweenDates! / secondsInDays))
let weekBetweenDates = Int((distanceBetweenDates! / secondsInWeek))
print(weekBetweenDates,"weeks")//0 weeks
print(daysBetweenDates,"days")//5 days
print(hoursBetweenDates,"hours")//120 hours
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Une autre option consiste à utiliser
NSCalendar
's-components:fromDate:toDate:options:
método.0 votes
Je ne pense pas que cela vous donnera un nombre absolu d'heures. Elle ne vous donnera qu'une valeur de 0 à 24, où vous devrez vous fier aux composants Jour, Mois et Année pour obtenir l'intervalle de temps complet.
0 votes
Je l'ai testé, et cela fonctionne parfaitement. Avec fromDate 1/Jan/2012 et toDate 4/Jan/2012, cela a donné 96 heures.
0 votes
Postez votre code Thomas ? Il ne fonctionne pas pour certains.