Como converter NSDate em unix timestamp iphone sdk?

143

Como converter um NSDatetimestamp para Unix? Eu li muitos posts que fazem o contrário. Mas não estou encontrando nada relacionado à minha pergunta.

neha
fonte

Respostas:

269

Acredito que este é o seletor do NSDate que você está procurando:

- (NSTimeInterval)timeIntervalSince1970
BAndonovski
fonte
2
Isso retorna um carimbo de data e hora unix se fornecido com um nsdate?
Neh
1
Sim, é exatamente isso que você está procurando. O UNIX mede o tempo em segundos desde 1º de janeiro de 1970, e esse método retorna o intervalo entre o receptor (o NSDate que você fornece) e o primeiro instante de 1 de janeiro de 1970, GMT. NSTimeInterval é na verdade um typedef de double.
precisa saber é o seguinte
26
Para obter uma string (28/11/2011 14:14:13 <-> 1322486053): [NSString stringWithFormat: @ "%. 0f", [aDate timeIntervalSince1970]];
ıɾuǝʞ
2
O método é alterado pelo tempo definido no dispositivo em geral. Fiz um teste em que obtive o carimbo de data e hora às 12h e depois mudei o iPad no tempo para 20h e a diferença entre os dois números era extremamente alta. Se o timestamp havia tempo dispositivo dependentes dos números deveria ter sido fora por apenas alguns segundos, mas neste caso eu tive que concluir que o tempo no iPad afeta a unixTimeStamp
Esko918
1
@ Esko918 Bem, é claro. O horário do Unix descreve o número de segundos de 1970 até o momento que você deseja especificar ("agora" neste caso). Se você alterar a hora no iPad, alterará efetivamente "agora" para outra hora e, portanto, a diferença nos carimbos de hora.
Marsbear #
69

Um registro de data e hora do Unix é o número de segundos desde 00:00:00 UTC de 1º de janeiro de 1970. É representado pelo tipo time_t , que geralmente é um tipo inteiro de 32 bits assinado (long ou int).

O iOS fornece - (NSTimeInterval) timeIntervalSince1970 para objetos NSDate que retornam o número de segundos desde 00:00:00 GMT de 1º de janeiro de 1970. NSTimeInterval é um tipo de ponto flutuante duplo para que você obtenha os segundos e frações de segundo.

Como ambos têm a mesma referência (meia-noite 1Jan1970 UTC) e são ambos em segundos, a conversão é fácil, converta o NSTimeInterval em um time_t, arredondando ou truncando, dependendo de suas necessidades:

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
progrmr
fonte
Esta função mostra a data correta, mas a hora está errada. Não corresponde à hora do sistema.
neha
A hora Unix é UTC (GMT), a Índia é UTC + 5,5. Está fora por 5,5 horas?
precisa saber é o seguinte
7
A hora do sistema está mostrando a hora no fuso horário local, o que é bom. O carimbo de data e hora do Unix não é hora local, é sempre hora UTC; difere de +5: 30 na Índia, -7: 00 a partir daqui. Está correto.
precisa saber é o seguinte
Mas então como usá-lo? Posso usá-lo em meus cálculos mais tarde? Eu tenho um timestamp UNIX de um banco de dados PHP online e, em seguida, este. Quero comparar os dois para tomar a decisão de baixar os dados mais recentes sobre um objeto.
JeroenEijkhof
Eu só estou fazendo isso agora: int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) onde piece.piece.last_view é um NSDate
JeroenEijkhof
26

Você pode criar uma data de data e hora unix a partir de uma data da seguinte maneira:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
Peter Van de Put
fonte
21
Isso está errado, timeIntervalSince1970 retorna um TimeInterval que é na verdade um duplo.
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;
    }

OBSERVAÇÃO: - O carimbo de data e hora deve estar na zona UTC; portanto, converto nosso horário local em horário UTC.

Vicky
fonte
6

Rápido

Atualizado para o Swift 3

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

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

Notas

  • timeIntervalSince1970retorna TimeInterval, que é uma tipealias para Double.

  • Se você quisesse seguir o outro caminho, poderia fazer o seguinte:

      let myDate = Date(timeIntervalSince1970: myTimeStamp)
Suragch
fonte
5

Se você deseja armazenar esse tempo em um banco de dados ou enviá-lo pelo servidor ... o melhor é usar os carimbos de data e hora do Unix. Aqui está um pequeno trecho para obter isso:

+ (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
fonte
Por que você está definindo horas e minutos para 0 nos componentes? Além disso, como ele fornecerá o UTC exato com base nisso [[NSTimeZone systemTimeZone] secondsFromGMT]]:? Por favor, explique pouco.
Hemang 5/08/15
Oi amigo, ele me ajudou
Rahul K Rajan 11/01
5

Minha maneira preferida é simplesmente:

NSDate.date.timeIntervalSince1970;
Alex
fonte
4

Conforme sugestão do @ kexik, usando a função de horário UNIX, conforme abaixo:

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

. Conforme minha experiência - não use timeIntervalSince1970, ele fornece o carimbo de data / hora da época - número de segundos em que você está atrás do GMT.

Costumava haver um bug com [[NSDate date] timeIntervalSince1970], que costumava adicionar / subtrair horas com base no fuso horário do telefone, mas parece estar resolvido agora.

Tapan Thaker
fonte
Estou corrigindo minha resposta - realmente parece ser igual. Embora o tempo (NULL) possa ser um pouco mais rápido, ele não está chamando o tempo de execução obj-c. : P Código de teste NSLog (@ "time (NULL) =% d; timeIntervalSince1970 =% d", (int) time (NULL), (int) [[data NSDate] timeIntervalSince1970]);
K3a
Eu enfrentei problemas com [[NSDate date] timeIntervalSince1970]. Eles parecem considerar a região em que você está também.
Tapan Thaker
Sim, é isso que eu acho que eu experimentei naquele dia, mas em iOS7 Simulator e um dispositivo iOS6 com GMT + 2 fuso horário que eles agora parecem iguais ... De qualquer forma, o tempo (NULL) funciona 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]]; 

primeiro unixtime 1532278070

segundo tempo unix 1532278070.461380

terceiro tempo unixtime 1532278070

user1105951
fonte
0

Se você precisar de carimbo de data / hora como uma string.

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
nanjunda
fonte