0

我对 CalCalendar 中的全天活动有 TimeZone 问题:

- (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,在 GMT,根据这个 NSLog 输出:

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

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

如何确保我为所有时区在正确的一天设置全天事件?我可以轻松增加三个小时,但这在全球范围内都行不通!

4

1 回答 1

1

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

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

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

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

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

于 2012-06-04T02:47:48.047 回答