我试图从用户的日历应用程序获取事件。这本身工作得很好,但有一件事是不完全正确的。我用不同的标签显示title
, location
, startDate
和endDate
。现在,我的问题是endDate
和startDate
都晚了一个小时,所以当我设置一个事件为19:00时,它在我的应用程序中显示为18:00。我使用这个代码:
// Create the predicate's start and end dates.
CFGregorianDate gregorianStartDate, gregorianEndDate;
CFGregorianUnits startUnits = {0, 0, -30, 0, 0, 0};
CFGregorianUnits endUnits = {0, 0, 15, 0, 0, 0};
CFTimeZoneRef timeZone = CFTimeZoneCopySystem();
gregorianStartDate = CFAbsoluteTimeGetGregorianDate(
CFAbsoluteTimeAddGregorianUnits(CFAbsoluteTimeGetCurrent(), timeZone, startUnits),
timeZone);
gregorianStartDate.hour = 0;
gregorianStartDate.minute = 0;
gregorianStartDate.second = 0;
gregorianEndDate = CFAbsoluteTimeGetGregorianDate(
CFAbsoluteTimeAddGregorianUnits(CFAbsoluteTimeGetCurrent(), timeZone, endUnits),
timeZone);
gregorianEndDate.hour = 0;
gregorianEndDate.minute = 0;
gregorianEndDate.second = 0;
NSDate* startDate =
[NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianStartDate, timeZone)];
NSDate* endDate =
[NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianEndDate, timeZone)];
CFRelease(timeZone);
// Create the predicate.
NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:nil]; // eventStore is an instance variable.
// Fetch all events that match the predicate.
NSArray *events = [eventStore eventsMatchingPredicate:predicate];
有人知道如何解决这个问题吗?提前感谢!
好吧,我自己想出来了。我所要做的就是添加这一行:
int z = [[NSTimeZone localTimeZone] secondsFromGMT] / 3600;
并将z添加到startDate
和endDate
您确定系统的时区与日历的时区相同吗?我以前遇到过一些奇怪的问题,因为我所处的时区与创建日历事件时不同,所以结果略有不同(相差一两个小时)。奇怪的问题。