10

私は、iPhone で Core Data を使用して毎日のデータを保存する賢明な方法を見つけようとしています。

私のアプリは、日付はあるが時刻がない csv 形式でデータを受け取ります。

date, cycles
2009-08-01, 123
2009-08-02, 234
2009-08-03, 345
2009-08-04, 456

このデータが保存される場合、1 日に 1 つのレコードのみが存在する必要があります。最善の方法は、保存する NSDate を作成することですが、時間とタイムゾーンのデータを取り除くことだと思いました。

NSDateComponents または NSDateFormatter を使用して、時間、分、または秒なしで NSDate を簡単に作成できます。ただし、タイム ゾーンを明示的に UTC または GMT から 0 秒に設定した場合でも、NSLog() で作成された日付を出力すると、常に次のようなローカル タイムゾーンになります。

2009-07-29 00:00:00 +0100

時間コンポーネントなしで NSDates を作成するより良い方法を知っている人はいますか? それとも、日付を保存するより良い方法でしょうか?

4

3 に答える 3

12

適切なプログラミングの経験則は、日付を常に UTC で保存することです。Core Data を使用するかどうかは問題ではありません。Apple の日付クラスはかなりひどいので、まだいくつかの作業を行う必要があります。

日付は、2001 年 1 月 1 日 00:00:00 であると思われる基準日からの秒数として内部的に表されます (ただし、実際の基準日はそれほど重要ではありません)。ポイントは、NSDateオブジェクトは常にネイティブに UTC であるということです。CSV ファイルで取得している日付がローカルの場合、UTC 時刻を取得するには次のようにする必要があります。

NSDate *UTCDate = [localDate addTimeInterval:-[[NSTimeZone localTimeZone] secondsFromGMT]];

次に、時刻を 00:00:00 に設定します。これで、UTC で真夜中の日付を保存しています。プレゼンテーションの目的で、NSDateFormatter選択したタイム ゾーンで構成された を使用して (指定しない場合は、システムのタイム ゾーンがデフォルトになります)、これらの日付を表示します。

ただし、日付だけを扱っている場合は、タイム ゾーンはそれほど重要ではありません。タイム ゾーンNSDateFormatterを UTC に設定している限り、ユーザーがデバイスで選択したタイム ゾーンに関係なく、常に同じ日付が表示されます。

この解決策が気に入らない場合は、いつでも別の形式で日付を保存できます。doubleまたはを使用してint、日付をカスタム形式 (たとえば、基準日からの日数) で保存したり、独自のクラスをロールして、日付を正確にモデル化してNSDataオブジェクトとして保存したりすることもできます。クラスが を実装している限り、それをCore DataNSCodingのオブジェクトにシリアル化できます。NSDataCore Data の属性タイプを「Transformable」に設定するだけです。

ここにはたくさんのオプションがありますが、どれも独自の SQLite クエリとデータベースを作成する労力を必要としません。

于 2009-08-05T14:59:41.543 に答える
3

NSDate にはタイム ゾーンがありません。NSLog はローカル タイム ゾーンを使用します。+0100 と表示されているのは、そこがあなたのいる場所だからです。

于 2009-08-05T17:03:11.073 に答える
2

NSDate オブジェクトは常に日時を組み込みます - ドキュメントを引用すると、それは「単一の時点を表す」ものであり、基準日 (2001 年 1 月 1 日 GMT の開始) からの時間値を格納することによってそうします。ドキュメント)。したがって、時刻を認識しない NSDate を持つことはできません。

日付を独自の方法で保存しようとするのではなく、モデルで NSDate を使用し、エンティティ クラスにメソッドのペアを追加することを検討します。そのうちの 1 つは、上記で説明したことを実行し、NSDate を 00:00:00 に設定します。ある日。もう 1 つは、好みの形式で NSDate から日付だけを返すことができます。次に、Core Data によって生成されたゲッターとセッターを使用して、NSDate プロパティにアクセスします。

NSDate を引き続き使用することで、Core Data がネイティブに動作できるクラスを使用していることになります。つまり、述語を簡単に使用してフィルタリングしたり、フェッチした結果を日付で並べ替えたりすることができます。

于 2009-08-05T11:03:15.193 に答える