Qual é a melhor maneira de armazenar um NSDate em NSUserDefaults?

Há duas maneiras de armazenar um NSDate em NSUserDefaults que eu encontrei.

Opção 1 – setObject: forKey:

// Set NSDate *myDate = [NSDate date]; [[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"]; // Get NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"]; 

Opção 2 – timeIntervalSince1970

 // Set NSDate *myDate = [NSDate date]; NSTimeInterval myDateTimeInterval = [myDate timeIntervalSince1970]; [[NSUserDefaults standardUserDefaults] setFloat:myDateTimeInterval forKey:@"myDateKey"]; // Get NSTimeInterval myDateTimeInterval = [[NSUserDefaults standardUserDefaults] floatForKey:@"myDateKey"]; NSDate *myDate = [NSDate dateWithTimeIntervalSince1970:myDateTimeInterval]; 

Prós e contras

Opção 1

Isso parece ser compacto e lógico. No entanto, tenho preocupações sobre isso dar errado por causa de erros de formatação de data .

opção 2

Isso parece ser desajeitado. Eu também não tenho certeza da precisão disso – em um teste que fiz, quando recuperei a data de volta, saí por 48 segundos, apesar do Apple Docs dizer que o NSTimeInterval tem “precisão de subsegundos”.

Requisitos

Qualquer método que eu escolha, deve ser:

  1. Preciso para dentro de um segundo.

  2. Legível e confiável.

Minha pergunta

É a imprecisão com a Opção 2 porque estou fazendo algo errado?

Quais dessas duas opções você usaria?

Existe outra opção que não conheço?

Obrigado!

Você está desnecessariamente complicando as coisas. Por que você está convertendo a data em um intervalo de tempo (então o intervalo de tempo para uma primitiva diferente)? Apenas [sharedDefaults setObject:theDate forKey:@"theDateKey"] e [sharedDefaults setObject:theDate forKey:@"theDateKey"] com isso. O NSDate é um dos “principais tipos” suportados pelo formato PLIST (datas, números, cadeias de caracteres, dados, dictionarys e matrizes), para que você possa armazená-lo diretamente.

Veja a documentação para prova.

Basta armazenar e recuperar a data diretamente e vê-la fazer a coisa certa (incluindo fusos horários, precisão, etc). Não há nenhum formatador envolvido, como outros disseram.

Para a opção 1, não acredito que um formatador de data esteja envolvido. Possivelmente sob o capô, mas imagino que não esteja quebrado. A data é armazenada no formulário ISO 8601 .

Para a opção 2, use -setDouble:forKey: e -doubleForKey vez das versões baseadas em float . Isso pode ser a causa de seus erros de precisão.

Use NSUserDefaults; as datas são armazenadas na hora do Zulu, portanto, não há problemas de fuso horário para se preocupar. Guarde-o em seu fuso horário, puxe-o para fora em outro fuso horário, você vai ficar bem, o sistema lida com a conversão (sem formatador de data para se preocupar).

Se você está salvando a data de expiração da API do Facebook Graph, eu usaria * Option 2 * .

A opção dois pode ser facilmente convertida em uma string (usando stringWithFormat). Mais importante, funciona para a API do Graph.

Além disso, você não precisa se preocupar com o formato da sua data. Não lidar com NSDateFormatter vale a pena a possibilidade de um erro de 48 segundos.