Comment convertir NSDate en horodatage Unix iPhone SDK?

143

Comment convertir un NSDatehorodatage en Unix? J'ai lu de nombreux articles qui font l'inverse. Mais je ne trouve rien en rapport avec ma question.

neha
la source

Réponses:

269

Je crois que c'est le sélecteur NSDate que vous recherchez:

- (NSTimeInterval)timeIntervalSince1970
BAndonovski
la source
2
Cela renvoie-t-il un horodatage Unix s'il est fourni avec un nsdate?
neha
1
Oui, c'est exactement ce que vous recherchez. UNIX mesure le temps en secondes depuis le 1er janvier 1970, et cette méthode renvoie l'intervalle entre le récepteur (le NSDate que vous fournissez) et le premier instant du 1er janvier 1970, GMT. NSTimeInterval est en fait un typedef de double.
BAndonovski
26
Pour obtenir une chaîne (28/11/2011 14:14:13 <-> 1322486053): [NSString stringWithFormat: @ "%. 0f", [aDate timeIntervalSince1970]];
ıɾuǝʞ
2
La méthode est modifiée par l'heure définie sur l'appareil en général. J'ai fait un test où j'ai obtenu l'horodatage à 12 heures, puis changé à peu près à l'heure sur l'iPad à environ 20 heures et la différence entre les deux chiffres était extrêmement élevée. Si l'horodatage ne dépendait pas du temps de l'appareil, les chiffres auraient dû être décalés de quelques secondes, mais dans ce cas, je devais en conclure que l'heure sur l'iPad affecte le unixTimeStamp
Esko918
1
@ Esko918 Bien sûr. L'heure Unix décrit le nombre de secondes entre 1970 et le moment que vous souhaitez spécifier ("maintenant" dans ce cas). Si vous changez l'heure sur votre iPad, vous changez effectivement «maintenant» à une autre heure et par conséquent la différence dans les horodatages.
marsbear
69

Un horodatage Unix est le nombre de secondes depuis 00:00:00 UTC le 1er janvier 1970. Il est représenté par le type time_t , qui est généralement un type entier 32 bits signé (long ou int).

iOS fournit - (NSTimeInterval) timeIntervalSince1970 pour les objets NSDate qui renvoie le nombre de secondes depuis 00:00:00 GMT le 1er janvier 1970. NSTimeInterval est un type à virgule flottante double, vous obtenez donc les secondes et les fractions de seconde.

Puisqu'ils ont tous les deux la même référence (minuit 1Jan1970 UTC) et sont tous les deux en secondes, la conversion est facile, convertissez le NSTimeInterval en time_t, arrondi ou tronqué selon vos besoins:

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
progrmr
la source
Cette fonction me montre la date correcte mais l'heure est erronée. Cela ne correspond pas à l'heure du système.
neha
L'heure Unix est UTC (GMT), l'Inde est UTC + 5,5. Est-il éteint de 5,5 heures?
programme du
7
L'heure de votre système affiche l'heure dans votre fuseau horaire local, ce qui est très bien. L'horodatage Unix n'est pas l'heure locale, c'est toujours l'heure UTC, elle diffère de +5: 30 en Inde, -7: 00 d'ici. C'est correct.
progrmr
Mais alors comment l'utiliser? Puis-je l'utiliser dans mes calculs plus tard? J'ai un horodatage UNIX d'une base de données PHP en ligne, puis celui-ci. Je veux comparer les deux afin de prendre la décision de télécharger les dernières données sur un objet.
JeroenEijkhof
Je fais juste ceci maintenant: int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) où piece.piece.last_view est un NSDate
JeroenEijkhof
26

Vous pouvez créer une date d'horodatage unix à partir d'une date de cette façon:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
Peter Van de Put
la source
21
C'est faux, timeIntervalSince1970 renvoie un TimeInterval qui est en fait un double.
Matt Wolfe
9
- (void)GetCurrentTimeStamp
    {
        NSDateFormatter *objDateformat = [[NSDateFormatter alloc] init];
        [objDateformat setDateFormat:@"yyyy-MM-dd"];
        NSString    *strTime = [objDateformat stringFromDate:[NSDate date]];
        NSString    *strUTCTime = [self GetUTCDateTimeFromLocalTime:strTime];//You can pass your date but be carefull about your date format of NSDateFormatter.
        NSDate *objUTCDate  = [objDateformat dateFromString:strUTCTime];
        long long milliseconds = (long long)([objUTCDate timeIntervalSince1970] * 1000.0);

        NSString *strTimeStamp = [Nsstring stringwithformat:@"%lld",milliseconds];
        NSLog(@"The Timestamp is = %@",strTimestamp);
    }

 - (NSString *) GetUTCDateTimeFromLocalTime:(NSString *)IN_strLocalTime
    {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd"];
        NSDate  *objDate    = [dateFormatter dateFromString:IN_strLocalTime];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        NSString *strDateTime   = [dateFormatter stringFromDate:objDate];
        return strDateTime;
    }

REMARQUE: - L'horodatage doit être dans la zone UTC, donc je convertis notre heure locale en heure UTC.

Vicky
la source
6

Rapide

Mis à jour pour Swift 3

// current date and time
let someDate = Date()

// time interval since 1970
let myTimeStamp = someDate.timeIntervalSince1970

Remarques

  • timeIntervalSince1970renvoie TimeInterval, qui est un typealias pour Double.

  • Si vous vouliez aller dans l'autre sens, vous pourriez faire ce qui suit:

      let myDate = Date(timeIntervalSince1970: myTimeStamp)
Suragch
la source
5

Si vous souhaitez stocker ces heures dans une base de données ou les envoyer sur le serveur ... le mieux est d'utiliser les horodatages Unix. Voici un petit extrait pour l'obtenir:

+ (NSTimeInterval)getUTCFormateDate{

    NSDateComponents *comps = [[NSCalendar currentCalendar] 
                               components:NSDayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit 
                               fromDate:[NSDate date]];
    [comps setHour:0];
    [comps setMinute:0];    
    [comps setSecond:[[NSTimeZone systemTimeZone] secondsFromGMT]];

    return [[[NSCalendar currentCalendar] dateFromComponents:comps] timeIntervalSince1970];  
}
aahsanali
la source
Pourquoi définissez-vous l'heure et les minutes sur 0 dans les composants? Aussi, comment cela vous donnera-t-il l'heure UTC exacte en fonction de ceci [[NSTimeZone systemTimeZone] secondsFromGMT]]:? Veuillez expliquer peu.
Hemang
Salut ami, ça m'a aidé
Rahul K Rajan
5

Ma méthode préférée est simplement:

NSDate.date.timeIntervalSince1970;
Alex
la source
4

Selon la suggestion de @ kexik en utilisant la fonction de temps UNIX comme ci-dessous:

  time_t result = time(NULL);
  NSLog([NSString stringWithFormat:@"The current Unix epoch time is %d",(int)result]);

.Selon mon expérience - n'utilisez pas timeIntervalSince1970, cela donne l'horodatage de l'époque - le nombre de secondes que vous êtes derrière GMT.

Il y avait un bogue avec [[NSDate date] timeIntervalSince1970], il ajoutait / soustrait l'heure en fonction du fuseau horaire du téléphone mais il semble être résolu maintenant.

Tapan Thaker
la source
Je corrige ma réponse - cela semble vraiment égal. Bien que time (NULL) puisse être un peu plus rapide car il n'appelle pas le runtime obj-c. : P Test code NSLog (@ "time (NULL) =% d; timeIntervalSince1970 =% d", (int) time (NULL), (int) [[NSDate date] timeIntervalSince1970]);
k3a
J'ai rencontré des problèmes avec [[NSDate date] timeIntervalSince1970]. Ils semblent également tenir compte de la région dans laquelle vous vous trouvez.
Tapan Thaker
Oui, c'est ce que je pense avoir vécu ce jour-là, mais sur iOS7 Simulator et iOS6 avec le fuseau horaire GMT + 2, ils semblent maintenant égaux ... Quoi qu'il en soit, le temps (NULL) fonctionne toujours :)
k3a
2
 [NSString stringWithFormat: @"first unixtime is %ld",message,(long)[[NSDate date] timeIntervalSince1970]];

 [NSString stringWithFormat: @"second unixtime is %ld",message,[[NSDate date] timeIntervalSince1970]];

 [NSString stringWithFormat: @"third unixtime is %.0f",message,[[NSDate date] timeIntervalSince1970]]; 

premier unixtime 1532278070

deuxième unixtime 1532278070.461380

troisième unixtime 1532278070

user1105951
la source
0

Si vous avez besoin d'un horodatage sous forme de chaîne.

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
nanjunda
la source