Wie konvertiere ich NSDate in Unix Timestamp iPhone SDK?


143

Wie konvertiere NSDateich einen in Unix-Zeitstempel? Ich habe viele Beiträge gelesen, die das Gegenteil tun. Aber ich finde nichts im Zusammenhang mit meiner Frage.

Antworten:


269

Ich glaube, dies ist der Selektor des NSDate, den Sie suchen:

- (NSTimeInterval)timeIntervalSince1970

2
Gibt dies einen Unix-Zeitstempel zurück, wenn ein nsdate angegeben ist?
Neha

1
Ja, genau das suchen Sie. UNIX misst die Zeit in Sekunden seit dem 1. Januar 1970. Diese Methode gibt das Intervall zwischen dem Empfänger (dem von Ihnen angegebenen NSDate) und dem ersten Zeitpunkt des GMT vom 1. Januar 1970 zurück. NSTimeInterval ist eigentlich ein typedef von double.
BAndonovski

26
So rufen Sie eine Zeichenfolge ab (28/11/2011 14:14:13 <-> 1322486053): [NSString stringWithFormat: @ "%. 0f", [aDate timeIntervalSince1970]];
ıɾuǝʞ

2
Die Methode wird durch die am Gerät im Allgemeinen eingestellte Zeit geändert. Ich habe einen Test gemacht, bei dem ich den Zeitstempel um 12 Uhr bekam und mich dann um die Zeit auf dem iPad auf ungefähr 20 Uhr änderte und der Unterschied zwischen den beiden Zahlen extrem hoch war. Wenn der Zeitstempel nicht gerätezeitabhängig war, sollten die Zahlen nur wenige Sekunden entfernt sein, aber in diesem Fall musste ich feststellen, dass die Zeit auf dem iPad den unixTimeStamp
Esko918

1
@ Esko918 Na klar. Die Unix-Zeit beschreibt die Anzahl der Sekunden von 1970 bis zu dem Zeitpunkt, den Sie angeben möchten (in diesem Fall "jetzt"). Wenn Sie die Zeit auf Ihrem iPad ändern, ändern Sie effektiv "jetzt" zu einer anderen Zeit und damit den Unterschied in den Zeitstempeln.
Marsbear

69

Ein Unix-Zeitstempel ist die Anzahl der Sekunden seit 00:00:00 UTC am 1. Januar 1970. Er wird durch den Typ time_t dargestellt , bei dem es sich normalerweise um einen vorzeichenbehafteten 32-Bit-Integer-Typ (long oder int) handelt.

iOS bietet - (NSTimeInterval) timeIntervalSince1970 für NSDate-Objekte, das die Anzahl der Sekunden seit 00:00:00 GMT am 1. Januar 1970 zurückgibt. NSTimeInterval ist ein doppelter Gleitkommatyp, sodass Sie die Sekunden und Bruchteile einer Sekunde erhalten.

Da beide dieselbe Referenz haben (Mitternacht, 1. Januar 1970 UTC) und beide in Sekunden sind, ist die Konvertierung einfach. Konvertieren Sie das NSTimeInterval in ein time_t, runden oder kürzen Sie es je nach Ihren Anforderungen:

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];

Diese Funktion zeigt mir das richtige Datum, aber die Uhrzeit ist falsch. Es stimmt nicht mit der Systemzeit überein.
Neha

Unix-Zeit ist UTC (GMT), Indien ist UTC + 5.5. Ist es um 5,5 Stunden aus?
Programm

7
Ihre Systemzeit zeigt die Zeit in Ihrer lokalen Zeitzone an, was in Ordnung ist. Unix-Zeitstempel ist keine Ortszeit, es ist immer UTC-Zeit, es unterscheidet sich um +5: 30 in Indien, -7: 00 von hier. Das ist richtig.
Programm

Aber wie benutzt man es dann? Kann ich es später in meinen Berechnungen verwenden? Ich habe einen UNIX-Zeitstempel aus einer PHP-Datenbank online und dann diesen. Ich möchte die beiden vergleichen, um zu entscheiden, ob die neuesten Daten zu einem Objekt heruntergeladen werden sollen.
JeroenEijkhof

Ich mache das gerade jetzt: int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) wopiece.piece.last_view ein NSDate ist
JeroenEijkhof

26

Sie können ein Unix-Zeitstempeldatum aus einem Datum folgendermaßen erstellen:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];

21
Dies ist falsch. TimeIntervalSince1970 gibt ein TimeInterval zurück, das tatsächlich ein Double ist.
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;
    }

HINWEIS: - Der Zeitstempel muss sich in der UTC-Zone befinden. Daher konvertiere ich unsere Ortszeit in die UTC-Zeit.


6

Schnell

Aktualisiert für Swift 3

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

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

Anmerkungen

  • timeIntervalSince1970gibt zurück TimeInterval, was ein typealias für ist Double.

  • Wenn Sie in die andere Richtung gehen möchten, können Sie Folgendes tun:

      let myDate = Date(timeIntervalSince1970: myTimeStamp)

5

Wenn Sie diese Zeit in einer Datenbank speichern oder über den Server senden möchten, verwenden Sie am besten Unix-Zeitstempel. Hier ist ein kleiner Ausschnitt, um das zu bekommen:

+ (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];  
}

Warum setzen Sie Stunde und Minute in Komponenten auf 0? Wie erhalten Sie auf dieser Grundlage eine genaue UTC : [[NSTimeZone systemTimeZone] secondsFromGMT]]? Bitte erklären Sie wenig.
Hemang

Hallo Freund, es hat mir geholfen
Rahul K Rajan

5

Mein bevorzugter Weg ist einfach:

NSDate.date.timeIntervalSince1970;

4

Gemäß dem Vorschlag von @ kexik, die UNIX-Zeitfunktion wie folgt zu verwenden:

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

Nach meiner Erfahrung - verwenden Sie timeIntervalSince1970 nicht, es gibt einen Epochenzeitstempel - Anzahl der Sekunden, die Sie hinter GMT stehen.

Früher gab es einen Fehler mit [[NSDate date] timeIntervalSince1970]. Früher wurde die Zeit basierend auf der Zeitzone des Telefons addiert / subtrahiert, aber jetzt scheint sie behoben zu sein.


Ich korrigiere meine Antwort - es scheint wirklich gleich zu sein. Obwohl die Zeit (NULL) möglicherweise etwas schneller ist, da sie nicht die obj-c-Laufzeit aufruft. : P Testcode NSLog (@ "time (NULL) =% d; timeIntervalSince1970 =% d", (int) time (NULL), (int) [[NSDate date] timeIntervalSince1970]);
k3a

Ich habe Probleme mit [[NSDate date] timeIntervalSince1970]. Sie scheinen auch die Region zu berücksichtigen, in der Sie sich befinden.
Tapan Thaker

Ja, das ist es, was ich an diesem Tag erlebt habe, aber auf iOS7 Simulator und iOS6-Geräten mit GMT + 2-Zeitzone scheinen sie jetzt gleich zu sein ... Wie auch immer, die Zeit (NULL) funktioniert immer :)
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]]; 

erste Unixtime 1532278070

zweite Unixtime 1532278070.461380

dritte Unixtime 1532278070


0

Wenn Sie einen Zeitstempel als Zeichenfolge benötigen.

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.