3

EventKit フレームワークを使用して、iPhone カレンダーにエントリを作成する必要があります。

私のアプリは国際的でなければならないので、さまざまなタイムゾーンに注意する必要があります。私が今していること:

イベントは午前 6 時に開始する必要があります。したがって、次のコードで NSDate オブジェクトを作成しています。

[NSDate dateWithString:[NSString stringWithFormat:@"%d-%d-%d %d:%d:00 +0000",year,month,day,hour,minute]];

私が得るのは、午前6時00分とタイムゾーンGMTのNSDateオブジェクトです。

この NSDate をイベントの startDate として使用する場合、システムのタイムゾーンを使用して、イベントが実際にカレンダーに午前 6:00 として表示されるようにします。

したがって、私はこのコードを使用します:

+(NSDate*) convertToSystemTimezone:(NSDate*)sourceDate
{   
    NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];  
    NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
    NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
    NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;   
    NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease];         
    return destinationDate; 
}

例として、デバイスのタイムゾーンを NEW YORK に変更します。コードをデバッグすると、タイムゾーンと -14400 秒のオフセットが正しく認識されます。したがって、私の開始と終了の NSDate オブジェクトは正しいようです。

カレンダーを見ると、アプリは午前 6:00 ではなく午前 4:00 に開始するイベントを作成しました。

私は何を間違っていますか??

編集:イベントを作成するための私のコード:

06:00 am から 08:00 am までのイベントを作成する例

int year=2011;
int month=6;
int day=26;
int hour=6;
int minute=0;

NSDate *startDate = [NSDate dateWithString:[NSString stringWithFormat:@"%d-%d-%d %d:%d:00 +0000",year,month,day,hour, minute];  
startDate=[self convertToSystemTimezone:startDate];

NSDate *endDate = [NSDate dateWithString:[NSString stringWithFormat:@"%d-%d-%d %d:%d:00 +0000",year,month,day,8, minute];   
endDate=[self convertToSystemTimezone:endDate];     

EKEventStore *eventDB = [[EKEventStore alloc] init];
EKEvent *myEvent  = [EKEvent eventWithEventStore:eventDB];      
myEvent.title  = @"Testevent";
myEvent.startDate = startDate;
myEvent.endDate   = endDate;
myEvent.allDay = NO;
[myEvent setCalendar:[eventDB defaultCalendarForNewEvents]];
NSError *err;                   
[eventDB saveEvent:myEvent span:EKSpanThisEvent error:&err];
[eventDB release];

既存のイベントの削除は示されていませんが、これはテスト済みで動作します。

4

1 に答える 1

2

システム タイム ゾーンの時刻を保持する場合は、次のようにします。

+(NSDate*) convertToSystemTimezone:(NSDate*)sourceDate {
    NSCalendar * calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    [calendar setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

    NSUInteger flags = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit );
    NSDateComponents * dateComponents = [calendar components:flags fromDate:sourceDate];

    [calendar setTimeZone:[NSTimeZone systemTimeZone]];
    NSDate * myDate = [calendar dateFromComponents:dateComponents];

    return myDate;
}

しかし、私はあなたが見るべきだと思いlocalTimeZoneますsystemTimeZone。他の場合は、上記のスニペットで変更できます。

編集

GMT で日付を取得してから変換する必要があるのはなぜですか? 直接できませんか?

NSCalendar * calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

NSDateComponents * dateComponents = [[[NSDateComponents alloc] init] autorelease];
[dateComponents setYear:2011];
[dateComponents setMonth:6];
[dateComponents setDay:26];
[dateComponents setHour:6];
[dateComponents setMinute:0];

NSDate * startDate = [calendar dateFromComponents:dateComponents];

[dateComponents setHour:8];
NSDate * endDate = [calendar dateFromComponents:dateComponents];

その後、インスタンスを作成して保存しEKEventます。

于 2011-06-26T09:05:45.103 に答える