私が出会ったNSUserDefaultsにNSDateを保存する方法は2つあります。
// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];
// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];
// 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];
オプション1
これはコンパクトで論理的なようです。ただし、 Date Formatterのバグ が原因で、これがうまくいかないのではないかと心配しています。
オプション2
これは不器用なようです。私はそれの正確さも確信していません-あるテストで、日付を取得したときに、Apple 「。
どの方法を選択しても、それは次のとおりでなければなりません。
1秒以内に正確に。
読みやすく信頼性の高い。
私は何か間違ったことをしているので、オプション2の不正確さはありますか?
これら2つのオプションのうち、どちらを使用しますか?
私が知らない別のオプションはありますか?
ありがとう!
あなたは不必要に物事を複雑にしている。なぜ日付を時間間隔に変換するのですか(そして、時間間隔を別のプリミティブに変換するのですか)?ただ[sharedDefaults setObject:theDate forKey:@"theDateKey"]
そしてそれで完了です。 NSDateは、PLIST形式(日付、数値、文字列、データ、辞書、および配列)でサポートされる「主要なタイプ」の1つであるため、直接保存できます。
ドキュメント を参照してください。
日付を直接保存して取得し、正しいことを行います(タイムゾーン、精度などを含む)。他の人が言ったように、フォーマッタは関係していません。
オプション#1の場合、日付フォーマッターが関係するとは思わない。おそらくボンネットの下にありますが、壊れていないと思います。日付は ISO 8601 形式で保存されます。
オプション#2には、float
ベースのバージョンの代わりに-setDouble:forKey:
および-doubleForKey
を使用します。これが精度エラーの原因である可能性があります。
NSUserDefaultsを使用します。日付はズールー時間に保存されているため、心配する時間帯の問題はありません。それをあなたのタイムゾーンに保存し、別のタイムゾーンに引き出してください。大丈夫です。システムが変換を処理します(心配する日付フォーマッタはありません)。
Facebook Graph APIから有効期限を保存する場合、*Option 2*を使用します。
オプション2は(stringWithFormatを使用して)文字列に簡単に変換できます。最も重要なことは、Graph APIで機能することです。
さらに、日付の形式について心配する必要はありません。 NSDateFormatterを処理しないと、48秒のエラーが発生する可能性があります。