3

iOS 設定アプリには、「タイム ゾーン サポート」という設定があります ([設定] > [メール、連絡先、カレンダー] > [タイム ゾーン サポート])。この設定がOFFの場合、問題はありません。また、この設定がONであるが、タイム ゾーン サポート (TZS) タイム ゾーンが の現在の値に設定されている場合systemTimeZoneも、問題はありません。 問題が発生するのは、設定がオンで、TZS タイム ゾーンが 以外のタイム ゾーンに設定されている場合systemTimeZoneのみです。

その最後のケースでは、eventsMatchingPredicate:(クラスのインスタンスでEKEventStore) メソッドによって返される配列は予想通り切り捨てられます。日付の範囲内にあるすべてのイベントのクエリを指定すると、 のインスタンスはEKEventStore、クエリ範囲の開始と TZS タイム ゾーンの最初の午前 0 時の間にあるイベントを返すことができません。

たとえば、2013 年 3 月 18 日のすべてのイベントを取得するには、systemTimeZone. が PDT であると仮定すると、systemTimeZone2013 年 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 タイム ゾーンの真夜中が常に含まれるようにすることで、イベントを見逃さないようにすることができます。次に、無関係なイベントを除外できます。ただし、明らかな理由から、

4

1 に答える 1

1

指定された NSDate 範囲の初日の特定のイベントが結果に返されないという同様の問題がありました。[EKEventStore eventsMatchingPredicate]デフォルトのタイムゾーンの影響を受けているようです。この回避策は最終的に私を助けました:

NSTimeZone *savedTimeZone = [NSTimeZone defaultTimeZone];
[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:calendars];
[NSTimeZone setDefaultTimeZone:savedTimeZone];
NSArray *events = [eventStore eventsMatchingPredicate:predicate];

これがあなたの特定のケースにも役立つことを願っています(私の場合、ユーザーの日付/時間のタイムゾーンはアプリのデフォルトのタイムゾーンとは異なりました。あなたの場合、カレンダー時間のサポートはオンですが、おそらく同じです'predicateForEventsWithStartDate' のシナリオ)

[EKEventStore eventsMatchingPredicate]私の意見では、指定された NSDates は、タイムゾーンに関係なく特定の時点を示すという意味で既に「タイムゾーンなし」であるため、これはバグまたは設計上の欠陥です。

于 2013-03-28T22:20:59.270 に答える