CalEvent with IsAllDay=TRUE 让我在时区问题上遇到了麻烦



我在CalCalendar中全天事件中遇到时区问题:

- (BOOL)setDayType:(NSString *)type 
            forDay:(NSDate *)date;
{
    NSError *err = nil;
    CalEvent *e = [CalEvent event];
    [e setTitle:type];
    [e setIsAllDay:YES];
    [e setStartDate:date];
    [e setEndDate:[date dateByAddingTimeInterval:1]];
    [e setCalendar:[self calendar]];
    if ( ![[CalCalendarStore defaultCalendarStore] saveEvent:e span:CalSpanThisEvent error:&err] )
    {
...

假设我将日期设置为 2012 年 1 月 2 日,时间为 00:00:00。我在GMT+2,所以时区+0200。我的日期对象在格林威治标准时间报告 1-1-2012, 22:00:00,根据以下 NSLog 输出:

"Set daytype ptd on 2012-01-01 22:00:00 +0000"

甚至在 1 月 1 日也生成全天!!

如何确保在所有时区的正确日期设置全天事件?我可以很容易地增加三个小时,但这在世界范围内不起作用!

只要date在当前时区的正确日期,您就可以按原样使用它。

您看到的"问题"是由于如果您通过NSLog(或在调试器中)打印存储的日期,它将始终向您显示GMT时间,因为NSDate不知道您所在的时区。

但是,由于date是一个特定的时间点,因此当您为用户设置其格式(使用日期格式化程序)时,只要保持一致,无论时区是什么,它都会显示正确的日期和时间。

您需要担心像您提到的添加/减去时间的唯一情况是,如果您需要一个跨多个时区的相同日期的时间点。

编辑:
因此,看起来iCal使用GMT时间来存储所有内容,因此您需要在GMT时区创建日期。 如果您需要这方面的帮助,请在创建NSDate的地方发布您的代码,我很乐意为您指出正确的方向。

相关内容

  • 没有找到相关文章