2013-01-02 11 views
6

Ottiene un timestamp unix dal database e sto cercando di creare una data leggibile da esso. Sto usando in questo modoCome convertire un timestamp unix in un tempo leggibile dall'uomo?

long t1=[time longLongValue]; 

NSDate* date=[NSDate dateWithTimeIntervalSince1970:t1]; 

dove l'ora è il timestamp. Quando stampo data ricevo

1956-02-18 19:04:01 +0000 

invece di

2013-01-02 12:31:03 +0000 

Il timestamp è stato 1356765933449

+1

leggi [questo] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html) e [questo] (http://stackoverflow.com/ domande/5739598/setting-date-format-for-nsdateformatter) – tkanzakic

risposta

7

Si tratta di una questione di integer overflow, come Boris correttamente sottolineato nella sua risposta.

Non so quale sia l'oggetto time, ma invece di un signed long int utilizzare uno NSTimeInterval.

Su iOS NSTimeInterval è attualmente definito come

typedef double NSTimeInterval; 

ma non si dovrebbe preoccuparsi troppo di questo. Attaccare con i sinonimi di tipo ti proteggerà nel caso in cui Apple decida di cambiare la definizione sottostante con qualcos'altro.

Detto questo è necessario modificare il codice a qualcosa come

NSTimeInterval epoch = [time doubleValue]; 
NSDate * date = [NSDate dateWithTimeIntervalSince1970:epoch]; 

quanto riguarda la questione del codice manutenibilità ho descritto prima, qui si sta esplicitamente utilizza un doubleValue (non si dispone di molte opzioni), ma il buon La cosa è che se Apple cambia la definizione di NSTimeInterval in qualcosa non compatibile con un assegnamento double, il compilatore ti farà sapere.

6

Prova questo

- (NSString *) getDateFromUnixFormat:(NSString *)unixFormat 
{ 

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:[unixFormat intValue]]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
    [dateFormatter setDateFormat:@"MMM dd, yyyy-h:mm"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
    //NSDate *date = [dateFormatter dateFromString:publicationDate]; 
    NSString *dte=[dateFormatter stringFromDate:date]; 

    [dateFormatter release]; 
    return dte; 

} 
+0

restituisce il 19 gennaio 2038-3: 14 per i messaggi inviati oggi. – zzzzz

+0

il timestamp unix era 1356765933449 – zzzzz

+0

Ok ho controllato con il mio metodo anche se uso intValue nel mio metodo per la data data restituisce lo stesso risultato ottenuto ma id uso doubleValue questo è quello che ho ottenuto il 14 marzo 44964-2 : 57, sembra che il timeStamp sia troppo grande – Talha

6

Il timestamp Unix ha solo 32 bit disponibili.

Poiché utilizzano un int firmato, contano i secondi dall'1.1.1970. Un int firmato a 32 bit può contenere solo valori fino a 2147483647, dove vuoi che sia 1356765933449. Ciò provoca un overflow e ciò fa sì che la tua data non sia valida.

Questo è anche conosciuto come il Year 2038 Problem, perché 2147483647 (valore massimo) sarà colpito 03:14:07 UTC Martedì 19 gennaio 2038.

+0

Grazie, per le informazioni relative al Problema dell'anno 2038. – Augustine

Problemi correlati