コアデータに時刻なしの日付を保存する方法
質問
私は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を時間コンポーネントなしで作成するより良い方法を知っている人はいますか?または、おそらく日付を保存するより良い方法ですか?
解決
優れたプログラミングの経験則は、常に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の午前0時に日付を保存します。プレゼンテーションのために、選択したタイムゾーン(指定しない場合はシステムタイムゾーンがデフォルトです)で構成された NSDateFormatter
を使用して、それらの日付を表示します。
ただし、タイムゾーンは、日付を処理するだけの場合は重要ではありません。 NSDateFormatter
のタイムゾーンをUTCに設定している限り、ユーザーがデバイスで選択したタイムゾーンに関係なく、常に同じ日付が表示されます。
この解決策が気に入らない場合は、いつでも別の形式で日付を保存できます。 double
または int
を使用して、カスタム形式(たとえば、参照日からの日数)で日付を保存したり、独自のクラスをロールして希望どおりに日付をモデル化し、 NSData
オブジェクトとして保存します。クラスが NSCoding
を実装している限り、Core Dataの NSData
オブジェクトにシリアル化できます。 Core Dataの属性タイプを" Transformable"に設定するだけです。
ここにはたくさんのオプションがありますが、どれも独自のSQLiteクエリとデータベースを書く努力を必要としません。
他のヒント
NSDateにはタイムゾーンがありません。 NSLogはローカルタイムゾーンを使用します。 +0100と表示されるのは、そこにいるからです。
NSDateオブジェクトには常に日付が組み込まれます。ドキュメントを引用するには、「単一の時点」を表します。また、参照日(2001年1月1日GMTの開始日、再びドキュメントによる)以降の時刻値を保存することで保存します。したがって、時刻を認識しないNSDateを持つことはできません。
日付を独自の方法で保存するのではなく、モデルでNSDateを使用し、エンティティクラスにメソッドのペアを追加することを検討します。 :00指定された日に。もう1つは、好みの形式でNSDateから日付だけを返すことができます。これらは、Core Dataが生成したゲッターとセッターを使用してNSDateプロパティにアクセスします。
NS