1

eventsMatchingPredicate: を使用して EKEventStore のインスタンスから 1 日のすべてのイベントを取得しようとしていますが、私が読んだように、NSDate オブジェクトはデフォルトで GMT に設定されていますが、EKEventStore はそうではありません。私の質問は、EKEventStore のタイムゾーンを変更したり、タイムゾーンごとに時間がずれないように NSDate オブジェクトを調整したりするにはどうすればよいですか?

たとえば、私は GMT -0600 にいて、カレンダー UI に使用している TKCalendarMonthView で 1 月 16 日と 17 日をクリックすると、両方の日付に Martin Luther King Day が表示されます。開始時刻は 1 月 16 日の午前 6 時で、終了時刻は 1 月 17 日の午前 5 時 59 分 (私のタイムゾーンの結果) であり、午前 0 時に開始して午後 11 時 59 分まで続くのではありません。イベントの取得に使用されるコードは次のとおりです。

- (void)calendarMonthView:(TKCalendarMonthView *)monthView didSelectDate:(NSDate *)d {
  // Update tableData with event data from date
  [tableData removeAllObjects];
  NSArray *a = [systemCalendar eventsMatchingPredicate:[systemCalendar predicateForEventsWithStartDate:d endDate:[NSDate dateWithTimeInterval:84600 sinceDate:d] calendars:nil]];
  [tableData addObjectsFromArray:a];
  [self.eventsTable reloadData];
}
4

1 に答える 1

2

私は短いタイムラインにいることを考えると、解決策を思いつきました.それはうまくいくようです. 私の唯一の懸念は、時間間隔のオフセット自体が負であっても、オフセットに -1 を掛けなければならなかったことです。NSDate に加算するのではなく減算しようとしているため、これは意味がありません。正の数から負の数を引いた数の方が大きいので、PM の反対側の GMT ゾーンが少し心配で、実際にすべての時間間隔に -1 を掛けるべきかどうか疑問に思っています。誰にも考えはありますか?

- (void)calendarMonthView:(TKCalendarMonthView *)monthView didSelectDate:(NSDate *)d {
  [NSTimeZone resetSystemTimeZone];
  NSTimeZone *tz = [NSTimeZone systemTimeZone];
  NSArray *comps = [[tz description] componentsSeparatedByString:@" "];
  NSTimeInterval offset = (NSTimeInterval)[[comps lastObject] floatValue];
  if (offset < 0) {
    offset *= -1;
  }
  NSDate *startDate = [d dateByAddingTimeInterval:offset];

  NSArray *a = [systemCalendar eventsMatchingPredicate:[systemCalendar predicateForEventsWithStartDate:startDate endDate:[NSDate dateWithTimeInterval:84600 sinceDate:startDate] calendars:nil]];
  NSLog(@"Events for the date: %@", a);
  [tableData addObjectsFromArray:a];
  [self.eventsTable reloadData];
}
于 2012-01-16T16:43:46.213 に答える