Comment puis-je convertir une NSTimeInterval
en NSDate
? Pensez-y comme un chronomètre. Je veux que la date initiale soit 00:00:00, et j'ai une NSTimeInterval
de X secondes.
Je dois le faire comme ceci parce que la NSTimeInterval
doit être convertie en un entier en utilisant lround
pour arrondir, puis convertie en un NSDate
pour utiliser la NSDateFormatter
afin de la lancer dans une chaîne.
Une NSTimeInterval
, comme son nom l'indique, um, ne représente pas la même chose qu'une NSDate
. Une NSDate
est un moment dans le temps. Un intervalle de temps est une période de temps. Pour obtenir un point d'un intervalle, vous devez avoir un autre point. Votre question revient à demander: "Comment puis-je convertir 12 pouces en un point de ce tableau que je coupe?" Eh bien, 12 pouces, à partir de à partir de où ?
Vous devez choisir une date de référence. Ce sera probablement la NSDate
représentant l'heure à laquelle vous avez démarré votre compteur. Ensuite, vous pouvez utiliser +[NSDate dateWithTimeInterval:sinceDate:]
ou -[NSDate dateByAddingTimeInterval:]
Cela dit, je suis sûr que vous réfléchissez à cela à l’arrière. Vous essayez d’afficher le temps écoulé depuis un point de départ, c’est-à-dire l’intervalle intervalle , et non l’heure actuelle. Chaque fois que vous mettez à jour l'affichage, vous devriez simplement utiliser le nouvel intervalle. Par exemple (en supposant qu'une minuterie se déclenche périodiquement pour effectuer la mise à jour):
- (void) updateElapsedTimeDisplay: (NSTimer *)tim {
// You could also have stored the start time using
// CFAbsoluteTimeGetCurrent()
NSTimeInterval elapsedTime = [startDate timeIntervalSinceNow];
// Divide the interval by 3600 and keep the quotient and remainder
div_t h = div(elapsedTime, 3600);
int hours = h.quot;
// Divide the remainder by 60; the quotient is minutes, the remainder
// is seconds.
div_t m = div(h.rem, 60);
int minutes = m.quot;
int seconds = m.rem;
// If you want to get the individual digits of the units, use div again
// with a divisor of 10.
NSLog(@"%d:%d:%d", hours, minutes, seconds);
}
Une conversion facile depuis et vers l'arrière est montrée ici:
NSDate * now = [NSDate date];
NSTimeInterval tiNow = [now timeIntervalSinceReferenceDate];
NSDate * newNow = [NSDate dateWithTimeIntervalSinceReferenceDate:tiNow];
Ole K Hornnes
Je vous déconseille d'utiliser NSDateFormatter
si vous souhaitez afficher des intervalles de temps. NSDateFormatter
est utile lorsque vous souhaitez afficher des heures dans un fuseau horaire local ou spécifique. Mais dans ce cas, il y aurait un problème si le fuseau horaire était réglé sur l'heure (par exemple, 23 heures par jour).
NSTimeInterval time = ...;
NSString *string = [NSString stringWithFormat:@"%02li:%02li:%02li",
lround(floor(time / 3600.)) % 100,
lround(floor(time / 60.)) % 60,
lround(floor(time)) % 60];
Si votre date initiale est stockée dans un objet NSDate
, vous pouvez obtenir une nouvelle date à tout intervalle dans le futur. Utilisez simplement dateByAddingTimeInterval:
comme ceci:
NSDate * originalDate = [NSDate date];
NSTimeInterval interval = 1;
NSDate * futureDate = [originalDate dateByAddingTimeInterval:interval];
Via Développeurs Apple :
// 1408709486 - valeur d'intervalle de temps
NSDate *lastUpdate = [[NSDate alloc] initWithTimeIntervalSince1970:1408709486];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
NSLog(@"date time: %@", [dateFormatter stringFromDate:lastUpdate]);
Vous obtiendrez: Date heure: 22 août 2014 15:11:26
NSTimeInterval
to NSDate
conversion en Swift:
let timeInterval = NSDate.timeIntervalSinceReferenceDate() // this is the time interval
NSDate(timeIntervalSinceReferenceDate: timeInterval)