Come convertire NSDate in und timestamp iphone sdk?


143

Come convertire un NSDatetimestamp in Unix? Ho letto molti post che fanno il contrario. Ma non trovo nulla di correlato alla mia domanda.

Risposte:


269

Credo che questo sia il selettore di NSDate che stai cercando:

- (NSTimeInterval)timeIntervalSince1970

2
Questo restituisce un timestamp unix se fornito con un nsdate?
neha,

1
Sì, questo è esattamente quello che stai cercando. UNIX misura il tempo in secondi dal 1 ° gennaio 1970 e questo metodo restituisce l'intervallo tra il ricevitore (la data NSD fornita) e il primo istante del 1 ° gennaio 1970, GMT. NSTimeInterval è in realtà un typedef di double.
BAndonovski,

26
Per ottenere una stringa (28/11/2011 14:14:13 <-> 1322486053): [NSString stringWithFormat: @ "%. 0f", [aDate timeIntervalSince1970]];
ɾɾuǝʞ,

2
Il metodo viene modificato dall'ora impostata sul dispositivo in generale. Ho fatto un test in cui ho ottenuto il timestamp alle 12:00, poi sono cambiato sull'orario dell'iPad a circa le 20:00 e la differenza tra i due numeri era estremamente elevata. Se il timestamp non dipendeva dal tempo del dispositivo, i numeri avrebbero dovuto essere spenti per pochi secondi, ma in questo caso ho dovuto concludere che il tempo sull'iPad influisce su unixTimeStamp
Esko918,

1
@ Esko918 Beh, certo. Il tempo Unix descrive il numero di secondi dal 1970 fino al momento in cui si desidera specificare ("ora" in questo caso). Se cambi l'ora sull'iPad, cambi effettivamente "ora" in un'altra ora e quindi la differenza nei timestamp.
marsbear

69

Un timestamp Unix è il numero di secondi a partire dalle 00:00:00 UTC del 1 ° gennaio 1970. È rappresentato dal tipo time_t , che di solito è un tipo intero a 32 bit con segno (long o int).

iOS fornisce - (NSTimeInterval) timeIntervalSince1970 per gli oggetti NSDate che restituisce il numero di secondi a partire dalle 00:00:00 GMT del 1 ° gennaio 1970. NSTimeInterval è un doppio tipo a virgola mobile in modo da ottenere i secondi e le frazioni di secondo.

Poiché entrambi hanno lo stesso riferimento (mezzanotte 1 gennaio 1970 UTC) e sono entrambi in pochi secondi, la conversione è semplice, converti NSTimeInterval in time_t, arrotondando o troncando a seconda delle tue esigenze:

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

Questa funzione mi mostra la data corretta ma l'ora è sbagliata. Non corrisponde all'ora di sistema.
neha,

L'ora Unix è UTC (GMT), l'India è UTC + 5.5. È spento di 5,5 ore?
progr.

7
L'ora del sistema mostra l'ora nel fuso orario locale, il che va bene. Il timestamp di Unix non è l'ora locale, è sempre l'ora UTC, differisce di +5: 30 in India, -7: 00 da qui. È corretto.
progr.

Ma allora come si usa? Posso usarlo nei miei calcoli in seguito? Ho un timestamp UNIX da un database PHP online e poi questo. Voglio confrontare i due al fine di prendere una decisione per scaricare gli ultimi dati su un oggetto.
JeroenEijkhof,

Lo sto solo facendo ora: int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) dove piece.piece.last_view è un NSDate
JeroenEijkhof

26

In questo modo puoi creare una data timestamp unix da una data:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];

21
Questo è sbagliato, timeIntervalSince1970 restituisce un TimeInterval che in realtà è un doppio.
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;
    }

NOTA: - Il timestamp deve essere nella zona UTC, quindi converto l'ora locale in ora UTC.


6

veloce

Aggiornato per Swift 3

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

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

Appunti

  • timeIntervalSince1970restituisce TimeInterval, che è un typealias per Double.

  • Se volessi andare dall'altra parte, potresti fare quanto segue:

      let myDate = Date(timeIntervalSince1970: myTimeStamp)

5

Se si desidera archiviare questi tempi in un database o inviarli sul server ... è preferibile utilizzare i timestamp Unix. Ecco un piccolo frammento per ottenerlo:

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

Perché stai impostando ora e minuti su 0 nei componenti? Inoltre, come ti darà UTC esatto in base a questo [[NSTimeZone systemTimeZone] secondsFromGMT]]:? Per favore, spiega poco.
Hemang,

Ciao amico, mi ha aiutato
Rahul K Rajan,

5

Il mio modo preferito è semplicemente:

NSDate.date.timeIntervalSince1970;

4

Come da suggerimento di @ kexik usando la funzione di tempo UNIX come di seguito:

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

Secondo la mia esperienza - non usare timeIntervalSince1970, dà il timestamp di epoca - il numero di secondi che sei dietro GMT.

C'era un bug con [[NSDate date] timeIntervalSince1970], usato per aggiungere / sottrarre il tempo in base al fuso orario del telefono, ma sembra essere risolto ora.


Sto correggendo la mia risposta - sembra davvero essere uguale. Sebbene il tempo (NULL) possa essere un po 'più veloce in quanto non chiama runtime obj-c. : P Codice test NSLog (@ "time (NULL) =% d; timeIntervalSince1970 =% d", (int) time (NULL), (int) [[NSDate date] timeIntervalSince1970]);
k3a,

Ho riscontrato problemi con [[data NSDate] timeIntervalSince1970]. Sembrano considerare anche la regione in cui ti trovi.
Tapan Thaker,

Sì, questo è quello che penso di aver vissuto quel giorno, ma su iOS7 Simulator e iOS6 con fuso orario GMT + 2 ora sembrano uguali ... Comunque, il tempo (NULL) funziona sempre :)
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]]; 

prima volta unixtime 1532278070

secondo unixtime 1532278070.461380

terza volta unixtime 1532278070


0

Se è necessario il timestamp come stringa.

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.