web-dev-qa-db-fra.com

NSTimeInterval to NSDate

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. 

16
Baub

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);
 }
34
Josh Caswell

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

14
olekeh

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];
12
Mats

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];
6
Alex Nichol

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

2
Vlad

NSTimeInterval to NSDate conversion en Swift:

let timeInterval = NSDate.timeIntervalSinceReferenceDate() // this is the time interval
NSDate(timeIntervalSinceReferenceDate: timeInterval)
0
Michael Dorner