Existem duas maneiras de armazenar um NSDate nos 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, eu tenho preocupações sobre isso dar errado por causa dos erros do Date Formatter .
opção 2
Isso parece ser desajeitado. Também não tenho certeza da precisão disso - em um teste que fiz, quando recuperei a data em que ela estava vencida em 48 segundos, apesar dos documentos da Apple dizerem que o NSTimeInterval tem "precisão de subsegundo".
Exigências
Qualquer que seja o método que eu escolher, deve ser:
Preciso em um segundo.
Legível e confiável.
Minha pergunta
A imprecisão com a opção 2 é porque estou fazendo algo errado?
Qual dessas duas opções você usaria?
Existe outra opção que eu não conheço?
Obrigado!
fonte
Para a opção 1, não acredito que esteja envolvido um formatador de datas. Possivelmente sob o capô, mas imagino que não esteja quebrado. A data é armazenada no formato ISO 8601 .
Para a opção 2, use
-setDouble:forKey:
e em-doubleForKey
vez dasfloat
versões baseadas em. Essa pode ser a causa dos seus erros de precisão.fonte
Use NSUserDefaults; As datas são armazenadas no horário Zulu, portanto, não há problemas de fuso horário com que se preocupar. Armazene-o no seu fuso horário, retire-o em outro fuso horário, você ficará bem, o sistema lida com a conversão (nenhum formatador de data para se preocupar).
fonte
Se você estiver salvando a data de validade da API do Facebook Graph, eu usaria a * Opção 2 * .
A opção dois pode ser facilmente convertida em uma string (usando stringWithFormat). Mais importante, ele 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 possibilidade de um erro de 48 segundos.
fonte