iOS 設定アプリには、「タイム ゾーン サポート」という設定があります ([設定] > [メール、連絡先、カレンダー] > [タイム ゾーン サポート])。この設定がOFFの場合、問題はありません。また、この設定がONであるが、タイム ゾーン サポート (TZS) タイム ゾーンが の現在の値に設定されている場合systemTimeZone
も、問題はありません。 問題が発生するのは、設定がオンで、TZS タイム ゾーンが 以外のタイム ゾーンに設定されている場合systemTimeZone
のみです。
その最後のケースでは、eventsMatchingPredicate:
(クラスのインスタンスでEKEventStore
) メソッドによって返される配列は予想通り切り捨てられます。日付の範囲内にあるすべてのイベントのクエリを指定すると、 のインスタンスはEKEventStore
、クエリ範囲の開始と TZS タイム ゾーンの最初の午前 0 時の間にあるイベントを返すことができません。
たとえば、2013 年 3 月 18 日のすべてのイベントを取得するには、systemTimeZone
. が PDT であると仮定すると、systemTimeZone
2013 年 3 月 18 日午前 7 時 GMT から 2013 年 3 月 19 日午前 7 時 GMT までのすべてのイベントを照会することになります (PDT は GMT - 7 時間であるため)。このクエリは、TZS がオフの場合でも、TZS がオンで PDT に設定されている場合でも正常に機能します。ただし、TZS が ON で EDT に設定されている場合、クエリ範囲の開始から EDT の最初の午前 0 時までのすべてのイベントが、結果の配列から失われます。EDT は GMT - 4 時間であるため、クエリ範囲内の EDT の最初の午前 0 時は 2013 年 3 月 19 日午前 4 時 GMT です。2013 年 3 月 18 日午前 7 時 GMT から 2013 年 3 月 19 日午前 4 時 GMT までのすべてのイベントは欠落し、結果の配列には、2013 年 3 月 19 日午前 4 時 GMT から 2013 年 3 月 19 日午前 7 時 GMT までのイベントのみが含まれます。
この結果は、シミュレーターと物理 iOS デバイス (私が試した任意の TZS タイム ゾーン) の両方で 100% 予測可能です。iOS 6 と iOS 6.1 でテストしましたが、動作に目立った違いはありません。これが予想される API の動作である理由について、私が見逃している理由はありますか? また、多くの検索にもかかわらず、デベロッパーが TZS がオンかオフか、ユーザーが設定したタイム ゾーンは言うまでもなく、判断できるようにするパブリック (またはプライベート) API はないようです。良い回避策... (明らかに、すべてのクエリの範囲を広げて、可能なすべての TZS タイム ゾーンの真夜中が常に含まれるようにすることで、イベントを見逃さないようにすることができます。次に、無関係なイベントを除外できます。ただし、明らかな理由から、