2011-08-29 2 views
1

カスタムタイムゾーンで使用すると、EKEventEditViewControllerに奇妙な問題があります。これは、2つの状況で異なる動作をします:EKEventEditViewControllerタイムゾーンの問題

状況1からは罰金作品:

  • 起動アプリ
  • たstartDate = [NSDate日付]
  • 新イベント開始があると、新しいイベントを追加するEKEventEditViewControllerを作成します。 (現時点)
  • [NSTimeZone setDefaultTimeZone:otherTimeZone]を使用してデフォルトタイムゾーンを変更する
  • EKEを作成する

    • 打ち上げ:予期しない動作 - ventEditViewControllerがたstartDate
    • 新イベント開始が正しく表示されている= [NSDate日付]で新しいイベントを追加する

    状況2(現在の時刻のタイムゾーンに調整) app

  • [NSTimeZone setDefaultTimeZone:otherTimeZone]を使用してデフォルトのタイムゾーンを変更する
  • startDatで新しいイベントを追加するEKEventEditViewControllerを作成するE = [NSDate日付]
  • 新イベント開始が正しく表示されない(システムタイムゾーンオフセット+デフォルトのタイムゾーンオフセット)
  • バックシステムのタイムゾーンに変更デフォルトのタイムゾーン[NSTimeZone setDefaultTimeZone:[NSTimeZone systemTimeZone]]
  • 追加するEKEventEditViewControllerを作成します。たstartDate = [NSDate日付]
  • 新イベント開始と新しいイベントは、まだ(システムタイムゾーンオフセット+デフォルトのタイムゾーンオフセット)が誤って表示されている

EKEventEditViewControllerの最初のディスプレイ上で、それは何らかの形で、デフォルトのtimezonをキャッシュすることを私の推測eとし、オフセットとして使用します。

誰も同じような問題に直面しましたか?これはバグですか、何か不足していますか?

+0

、ちょうどEventKitは[NSTimeZone setDefaultTimeZone:otherTimeZone]でカスタムタイムゾーンを設定した後、一般的には奇妙な振る舞いことに気づきました。たとえば、「開始」フィールドの時間は、UIDatePickerに表示される時間とは異なります。 – Laurynas

答えて

0

全く同じ問題がありました。私はGMT timeZoneでオフセットを(別々に)データベースにすべての日付を格納していました。私のアプリは、それが実行されている最初(GMT)からカスタムの時間帯を使用します。イベントをカレンダーにエクスポートしている間にそれらの日付を使用したい場合は、開始日と終了日が間違っていました。問題の解決に役立つものは、まずデータベースに保存された日付を、次のコンバータ方法(下記参照)を使用してシステムのタイムゾーンに変換しました。このように変換された日付はEKEventEditViewControllerに渡され、日付が正しく表示されました。あなたの問題も解決することを願っています。また

+ (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; }