177

私が遭遇した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

これは不器用なようです。また、その精度もわかりません。あるテストでは、日付を取得したときに、NSTimeIntervalの精度が「1秒未満」であるとApple Docsが言っていたにもかかわらず、48秒遅れていました。

要件

どの方法を選択する場合でも、次のようにする必要があります。

  1. 1秒以内に正確に。

  2. 読みやすく、信頼性があります。

私の質問

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

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

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

ありがとう!

4

4 に答える 4

385

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

証拠については、ドキュメントを参照してください。

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

于 2010-01-06T15:24:50.470 に答える
14

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

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

于 2010-01-06T15:16:55.653 に答える
5

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

于 2010-01-06T15:21:12.930 に答える
1

Facebook Graph APIから有効期限を保存する場合は、*オプション2 *を使用します。

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

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

于 2012-08-05T19:27:07.777 に答える