2013-01-02 8 views
6

Ich bekomme einen Unix-Zeitstempel von der Datenbank und ich versuche, ein menschenlesbares Datum daraus zu erstellen. Ich verwende diesen WegWie konvertiert man den Unix-Zeitstempel in die vom Menschen lesbare Zeit?

wo Zeit ist der Zeitstempel. Als ich Datum drucken bekomme ich

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

statt

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

Der Zeitstempel wurde 1356765933449

+1

lesen [this] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html) und [dies] (http://stackoverflow.com/ Fragen/5739598/setting-date-format-for-nsdateformatter) – tkanzakic

Antwort

7

Es ist eine Frage der Integer-Überlauf, als Boris wies in seiner Antwort darauf hin.

Ich weiß nicht, was Ihr time Objekt ist, aber anstelle von signed long int verwenden Sie eine NSTimeInterval.

Auf iOS NSTimeInterval wird derzeit als

typedef double NSTimeInterval; 

definiert, aber man sollte nicht zu viel über die Pflege. Bleiben Sie bei Typ-Synonymen, schützen Sie sich, falls Apple beschließt, die zugrundeliegende Definition in etwas anderes zu ändern.

Das heißt Sie Ihren Code so etwas wie

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

In Bezug auf den Code Wartbarkeit Ausgabe ändern sollte ich zuvor beschrieben, hier werden Sie explizit einen doubleValue verwenden (Sie müssen nicht viele Optionen haben), aber die gute Wenn Apple die NSTimeInterval Definition zu etwas ändert, das nicht mit einer double Zuweisung kompatibel ist, wird der Compiler Sie wissen lassen.

6

Try this

- (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

es gibt 19. Januar 2038-3 zurück: 14 für Nachrichten, die heute gesendet wurden. – zzzzz

+0

der Unix Timestamp war 1356765933449 – zzzzz

+0

Ok Ich überprüfte es mit meiner Methode auch, wenn ich IntValue in meiner Methode für Ihre gegebenen Zeitstempel verwendet, gibt es das gleiche Ergebnis wie Sie erhalten, aber ich verwende doubleValue das ist, was ich habe Mar 14, 44964-2 : 57, es scheint, dass der timeStamp viel zu groß ist – Talha

6

Der Unix-Zeitstempel nur 32 Bits zur Verfügung hat.

Da sie einen vorzeichenbehafteten int verwenden, zählen sie die Sekunden vom 1.1.1970. Ein 32-Bit-Zeichensatz int kann nur Werte bis zu 2147483647 enthalten, wobei Sie wie gewünscht 1356765933449 haben. Das verursacht einen Überlauf und das Datum wird ungültig. richtig

Dies wird auch als Year 2038 Problem, weil 2147483647 (Maximalwert) bekannt wird am 03.14.07 UTC am Dienstag getroffen werden, den 19. Januar 2038.

+0

Vielen Dank für die Informationen zum Jahr 2038 Problem. – Augustine

Verwandte Themen