Jak przekonwertować NSDate na unix timestamp iPhone SDK?

143

Jak przekonwertować NSDateznacznik czasu na uniksowy? Czytałem wiele postów, które robią odwrotnie. Ale nie znajduję niczego związanego z moim pytaniem.

neha
źródło

Odpowiedzi:

269

Wydaje mi się, że to selektor NSDate, którego szukasz:

- (NSTimeInterval)timeIntervalSince1970
BAndonovski
źródło
2
Czy to zwraca uniksowy znacznik czasu, jeśli jest dostarczony z nsdate?
neha
1
Tak, właśnie tego szukasz. UNIX mierzy czas w sekundach od 1 stycznia 1970 r., A ta metoda zwraca interwał między odbiornikiem (podaną przez Ciebie NSDate) a pierwszą chwilą 1 stycznia 1970 r. GMT. NSTimeInterval jest w rzeczywistości typem double.
BAndonovski
26
Aby uzyskać ciąg (28/11/2011 14:14:13 <-> 1322486053): [NSString stringWithFormat: @ "%. 0f", [aDate timeIntervalSince1970]];
ıɾuǝʞ
2
Metoda jest zmieniana ogólnie przez czas ustawiony w urządzeniu. Zrobiłem test, w którym dostałem znacznik czasu o godzinie 12:00, a następnie zmieniłem czas na iPadzie na około 20:00, a różnica w tych dwóch liczbach była bardzo duża. Jeśli znacznik czasu nie był zależny od czasu urządzenia, liczby powinny być przesunięte o zaledwie kilka sekund, ale w tym przypadku musiałem stwierdzić, że czas na iPadzie ma wpływ na unixTimeStamp
Esko918
1
@ Esko918 Cóż, oczywiście. Czas uniksowy opisuje liczbę sekund od 1970 do punktu w czasie, który chcesz określić (w tym przypadku „teraz”). Jeśli zmienisz czas na iPadzie, skutecznie zmienisz „teraz” na inny czas i stąd różnica w znacznikach czasu.
marsbear
69

Znacznik czasu systemu Unix to liczba sekund od 00:00:00 czasu UTC 1 stycznia 1970 r. Jest reprezentowany przez typ time_t , który jest zwykle 32-bitową liczbą całkowitą ze znakiem (long lub int).

iOS zapewnia - (NSTimeInterval) timeIntervalSince1970 dla obiektów które zwracają liczbę sekund od 00:00:00 GMT 1 stycznia 1970. NSTimeInterval jest typem podwójnej liczby zmiennoprzecinkowej, dzięki czemu uzyskujesz sekundy i ułamki sekundy.

Ponieważ oba mają to samo odniesienie (północ 1 stycznia 1970 UTC) i oba są podane w sekundach, konwersja jest łatwa, przekonwertuj NSTimeInterval na time_t, zaokrąglając lub skracając w zależności od potrzeb:

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
progrmr
źródło
Ta funkcja pokazuje mi poprawną datę, ale godzina jest nieprawidłowa. Nie pasuje do czasu systemowego.
neha
Czas Unix to UTC (GMT), Indie to UTC + 5,5. Czy to jest wyłączone o 5,5 godziny?
progrmr
7
Twój czas systemowy pokazuje czas w Twojej lokalnej strefie czasowej, co jest w porządku. Znacznik czasu uniksowego nie jest czasem lokalnym, zawsze jest to czas UTC, różni się o +5: 30 w Indiach, -7: 00 stąd. To jest poprawne.
progrmr
Ale jak tego używać? Czy mogę go później wykorzystać w obliczeniach? Mam jeden znacznik czasu UNIX z bazy danych PHP online, a następnie ten. Chcę porównać te dwa, aby podjąć decyzję o pobraniu najnowszych danych o obiekcie.
JeroenEijkhof
Po prostu robię to teraz: int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) gdzie piece.piece.last_view to
NSDate
26

Możesz utworzyć uniksową datę znacznika czasu od daty w następujący sposób:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
Peter Van de Put
źródło
21
To jest złe, timeIntervalSince1970 zwraca TimeInterval, który w rzeczywistości jest podwójny.
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;
    }

UWAGA: - Znacznik czasu musi być w strefie UTC, więc konwertuję nasz czas lokalny na czas UTC.

Vicky
źródło
6

Szybki

Zaktualizowano dla Swift 3

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

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

Uwagi

  • timeIntervalSince1970zwraca TimeInterval, co jest aliasem typu dla Double.

  • Jeśli chcesz pójść w drugą stronę, możesz wykonać następujące czynności:

      let myDate = Date(timeIntervalSince1970: myTimeStamp)
Suragch
źródło
5

Jeśli chcesz przechowywać ten czas w bazie danych lub wysłać go przez serwer ... najlepiej jest użyć uniksowych znaczników czasu. Oto mały fragment, aby to uzyskać:

+ (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
źródło
Dlaczego ustawiasz godziny i minuty na 0 w komponentach? Ponadto, w jaki sposób da ci dokładny czas UTC na podstawie tego [[NSTimeZone systemTimeZone] secondsFromGMT]]:? Proszę wyjaśnij trochę.
Hemang,
Cześć przyjacielu, pomogło mi
Rahul K Rajan
5

Mój preferowany sposób to po prostu:

NSDate.date.timeIntervalSince1970;
Alex
źródło
4

Zgodnie z sugestią @ kexik, używając funkcji czasu UNIX, jak poniżej:

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

.Jak z mojego doświadczenia - nie używaj timeIntervalS od 1970 roku, podaje znacznik czasu epoki - liczbę sekund, w których jesteś za GMT.

Kiedyś występował błąd z [[NSDate date] timeIntervalSince1970], dawał / odejmował czas na podstawie strefy czasowej telefonu, ale wydaje się, że został już rozwiązany.

Tapan Thaker
źródło
Poprawiam swoją odpowiedź - naprawdę wydaje się równa. Chociaż czas (NULL) może być odrobinę szybszy, ponieważ nie wywołuje funkcji runtime obj-c. : P Kod testu NSLog (@ "time (NULL) =% d; timeIntervalSince1970 =% d", (int) time (NULL), (int) [[NSDate date] timeIntervalSince1970]);
k3a
Wystąpiły problemy z [[NSDate date] timeIntervalSince1970]. Wydaje się, że biorą pod uwagę również region, w którym się znajdujesz.
Tapan Thaker
Tak, wydaje mi się, że tego dnia doświadczyłem, ale na symulatorze iOS7 i urządzeniu iOS6 ze strefą czasową GMT + 2 teraz wydają się równe ... W każdym razie czas (NULL) działa zawsze :)
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]]; 

pierwszy unixtime 1532278070

drugi unixtime 1532278070.461380

trzeci unixtime 1532278070

user1105951
źródło
0

Jeśli potrzebujesz znacznika czasu jako ciągu.

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
nanjunda
źródło