1. ホーム
  2. cocoa

[解決済み] NSUserDefaultsにNSDateを格納する最適な方法は何ですか?

2022-04-21 21:07:59

質問

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

これは、コンパクトで論理的だと思います。しかし、次のような理由でうまくいかないことが心配です。 日付フォーマッタのバグ .

オプション2

これは不器用な感じがします。あるテストでは、Apple DocsにNSTimeIntervalは秒以下の精度であると書かれているにもかかわらず、日付を取得したところ48秒違っていました。

必要条件

どんな方法を選んでも、そうでなければならない。

  1. 1秒以内の正確さ。

  2. 読みやすく、信頼できる。

私の質問

選択肢2の精度が悪いのは、私のやり方が悪いからでしょうか?

この2つのオプションのうち、あなたならどちらを使いますか?

私が知らない別の選択肢があるのでしょうか?

ありがとうございます。

解決方法は?

不必要に物事を複雑にしていますね。なぜ、日付を時間間隔に変換しているのですか(その後、時間間隔を別のプリミティブに変換しています)?ただ [sharedDefaults setObject:theDate forKey:@"theDateKey"] で終わりです。NSDateはPLISTフォーマットでサポートされている"main types"(日付、数値、文字列、データ、辞書、配列)の一つなので、直接保存すればいいのです。

参照 ドキュメント を使用することで証明できます。

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