2017-09-08 15 views
0

私がゾーン内にいるとしますUTC +0200date2017-10-04でレコードを保存したいとします。私はこのようにそれを行う:タイムゾーンを考慮した日付プロパティによるレコードの取得方法は?

service!.date = Calendar.current.date(from: DateComponents(year: date.year, month: date.month, day: date.day))! 

日付は次のように保存されます。

2017-10-04 22:00:00 +0000 

は今、私は毎日のためのサービスを表示する必要があります。デリゲートはdate、例えばサービスのために私に尋ねる:

2017-10-04 22:00:00 +0000 

すべては大丈夫です、レコードがフェッチされ、okです。

しかし、私は、デリゲートが同じdateために私に尋ねる別の国(UTC 0100)に旅行予定としたが、この時間は、それは次のようになります。

2017-10-04 23:00:00 +0000 

と...何も取得されていません。どうして?同じ日付ではないでしょうか?それを修正するには?私はレコードを取得する方法

述語は次のようになります。

NSPredicate(format: "date = %@", date as NSDate) 
+0

保存とフェッチは同じ形式で行う必要がありますUTCと思う –

+0

どういう意味ですか?アプリは生産中です...すべてが永続的なストアに保存されます。今、私はそれを修正する必要があります... –

+0

UTCで常に作業する必要がありますあなたの問題を解決する必要がありますUTCに変換する必要がありますそれを保存し、UTCに変換した後にフェッチする、私はあなたが私を理解している場合、私の英語のために申し訳ありませんがわからない –

答えて

0

私はこの権利を理解していた場合は、日付のみではなく、時間を気にしていますが、NSDateを使用して、それを保存しています、右?問題は、NSDateがタイムゾーンについて認識していないことです。いくつかのエポックから実際には数秒で、それを日付に変換する唯一の方法は、変換しているタイムゾーンを知ることです。

ここでの最良の答えはおそらくStringとして保存することです。 2017-10-04のように書式設定されています。そうでなければ、あなたが発見したように、時間帯によって同じ日が異なるDateで表されることになります。

iOS 10以降の場合は、NSISO8601DateFormatterを使用して対応できます。そうしないと、適切な形式でDateFormatterを設定できます。

また、あなたはNSDate sとそれを格納していきますが、日付コンポーネントから/に変換するCalendarを使用しているときは常にUTCタイムゾーンを指定するために特別な注意を取ることができます。


あなたは、生産のアプリケーションを修正する必要がある場合は、ここでの最善の解決策は、「ラウンド」の各日付は、最寄りの深夜値に、UTCで解釈というヒューリスティックを使用することが考えられます。これは、日付を作成するために使用されるタイムゾーンを効果的に回復するはずです。唯一の難しさは、UTCから12時間以上離れたタイムゾーン(実際にはUTC + 14:00のタイムゾーン)ですが、これらのタイムゾーンはほとんど無人島であると信じています。これらのタイムゾーンから作成された日付。

いずれの場合でも、すべてのデータを調べ、UTCを使用して日付コンポーネントに変換し、時間を確認する必要があります。あなたが最も近い真夜中に到達するために丸めたり丸めたりする必要があるかどうかを判断し、それに応じて実際の日付を調整します。その後、修正した日付コンポーネントを取得して、UTCを使用してNSDateに変換するか、データ形式を変更するかどうかに応じて文字列に変換して書き戻すことができます。

これはCoreDataなので、文字列に切り替える場合は、カスタムマイグレーションを実装してこれを処理できます。それ以外の場合は、データの影響を受けた場合には、何らかの方法で試してみる必要があります(この問題を修正した直後の初回起動時にすべての日付を書き換えたくないため)。

+0

それで何とかこれを処理する方法はありますか?アプリはプロダクションにあり、これを回避する必要があります。 –

+0

文字列解は、NSDateとして既に存在するので考慮されません。 –

+0

@BartłomiejSemańczyk私は提案で私の答えを更新しました。 –

関連する問題