Относительно NSDateComponents TimeZone - PullRequest
0 голосов
/ 22 марта 2012

Я должен установить UIAlertNotification в 18:00 по местному времени. Время установлено в 11:00 и будет до 18:00, потому что местный часовой пояс, в котором я сейчас нахожусь, - GMT + 6: 00. Однако в разных часовых поясах все будет иначе. Я хочу, чтобы это было 6:00 вечера в любом часовом поясе. Может ли кто-нибудь любезно помочь мне? Спасибо.

    NSDateComponents *comps=[[[NSDateComponents alloc]init]autorelease];
    [comps setYear:[year intValue]];
    [comps setMonth:[month intValue]];
    [comps setDay:[day intValue]];
    [comps setHour:[@"11" intValue]];//6pm
    [comps setMinute:0];
    [comps setMinute:0];
    [comps setTimeZone:[NSTimeZone localTimeZone]];
    NSCalendar *cal=[[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDate *date1=[[cal dateFromComponents:comps]retain];

// локальный код оповещения

    NSInteger minutesAhead = 0;
    NSTimeInterval seconds = (60 * minutesAhead) * -1;
    NSDate *actualFireDate = [date1 dateByAddingTimeInterval:seconds];
    NSMutableDictionary *dictC = [NSMutableDictionary dictionaryWithDictionary:userInfo];
    [dictC setObject:date1 forKey:@"PCOriginalReminderDate"];

    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.fireDate = actualFireDate;
    notification.alertBody = message;
    notification.userInfo = dictC;

    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
    [notification release];

Примечания:

Когда я печатаю дату, она говорит:

 date = "2012-04-04 18:00:00 +0000";

Я думаю, что это означает, что 11:00 было по Гринвичу, и добавление 7 часов (с его GMT +7 - дневной свет) и делает это 18:00.

1 Ответ

1 голос
/ 22 марта 2012

Вы хотите установить свойство timeZone вашего UILocalNotification:

Дата, указанная в fireDate, интерпретируется в соответствии со значением этого свойства. Если вы укажете nil (по умолчанию), дата запуска интерпретируется как абсолютное время по Гринвичу, что подходит для таких случаев, как таймеры обратного отсчета. Если вы назначите действительный объект NSTimeZone этому свойству, дата срабатывания интерпретируется как время настенных часов, которое автоматически корректируется при изменении часовых поясов; Примером, подходящим для этого случая, является будильник.

Так что, если вы установите fireDate вашего уведомления на время, которое вы создаете в своем фрагменте, и установите его timeZone на [NSTimeZone localTimeZone], тогда вы будете в порядке.

...