我在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
的地方发布您的代码,我很乐意为您指出正确的方向。