web-dev-qa-db-ja.com

NSDateをNSUserDefaultsに保存する最適な方法は何ですか?

私が出会ったNSUserDefaultsにNSDateを保存する方法は2つあります。

オプション1-setObject:forKey:

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

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

オプション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];

長所と短所

オプション1

これはコンパクトで論理的なようです。ただし、 Date Formatterのバグ が原因で、これがうまくいかないのではないかと心配しています。

オプション2

これは不器用なようです。私はそれの正確さも確信していません-あるテストで、日付を取得したときに、Apple 「。

必要条件

どの方法を選択しても、それは次のとおりでなければなりません。

  1. 1秒以内に正確に。

  2. 読みやすく信頼性の高い。

私の質問

私は何か間違ったことをしているので、オプション2の不正確さはありますか?

これら2つのオプションのうち、どちらを使用しますか?

私が知らない別のオプションはありますか?

ありがとう!

172
John Gallagher

あなたは不必要に物事を複雑にしている。なぜ日付を時間間隔に変換するのですか(そして、時間間隔を別のプリミティブに変換するのですか)?ただ[sharedDefaults setObject:theDate forKey:@"theDateKey"]そしてそれで完了です。 NSDateは、PLIST形式(日付、数値、文字列、データ、辞書、および配列)でサポートされる「主要なタイプ」の1つであるため、直接保存できます。

ドキュメント を参照してください。

日付を直接保存して取得し、正しいことを行います(タイムゾーン、精度などを含む)。他の人が言ったように、フォーマッタは関係していません。

378
Joshua Nozzi

オプション#1の場合、日付フォーマッターが関係するとは思わない。おそらくボンネットの下にありますが、壊れていないと思います。日付は ISO 8601 形式で保存されます。

オプション#2には、floatベースのバージョンの代わりに-setDouble:forKey:および-doubleForKeyを使用します。これが精度エラーの原因である可能性があります。

14
John Calsbeek

NSUserDefaultsを使用します。日付はズールー時間に保存されているため、心配する時間帯の問題はありません。それをあなたのタイムゾーンに保存し、別のタイムゾーンに引き出してください。大丈夫です。システムが変換を処理します(心配する日付フォーマッタはありません)。

5
Ben Gottlieb

Facebook Graph APIから有効期限を保存する場合、*Option 2*を使用します。

オプション2は(stringWithFormatを使用して)文字列に簡単に変換できます。最も重要なことは、Graph APIで機能することです。

さらに、日付の形式について心配する必要はありません。 NSDateFormatterを処理しないと、48秒のエラーが発生する可能性があります。

0
Nate Symer