NSTime: Почему [дата NSDateComponent] возвращает ноль здесь?

Я хочу конвертировать NSDate из одного часового пояса в другой.

Вот мой код:

NSDate* convertTime(NSDate* fromDate, NSTimeZone* fromTimeZone, NSTimeZone* toTimeZone) {
    if (fromTimeZone == toTimeZone) {
        return fromDate;
    }

    NSCalendarUnit val = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour| NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitTimeZone;
    NSCalendar* dupCal =  [[NSCalendar currentCalendar] copy];

    [dupCal setTimeZone:toTimeZone];
    NSDateComponents *dupComponents = [dupCal components:val fromDate:fromDate];

    return [dupComponents date]; // <- Why return nil?

}

int testTimeZone() {
    NSDate* res = convertTime([NSDate date], [NSTimeZone defaultTimeZone], [NSTimeZone timeZoneWithName:@"America/New_York"]);
    NSLog(@"convertTime: %@", res);
    return 0;

}

В окне вывода я вижу эту распечатку:

2014-02-15 11:15:18.040 MyApp[28742:70b] convertTime: (null)

По какой-то причине return [dupComponents date]; всегда возвращайте ноль, хотя я ясно вижу в отладчике, что он правильно инициализирован. Он содержит значения, которые я ожидаю.

Printing description of dupComponents:
<NSDateComponents: 0x100112260>
    TimeZone: America/New_York (EST) offset -18000
    Calendar Year: 2014
    Month: 2
    Leap month: no
    Day: 14
    Hour: 19
    Minute: 19
    Second: 29

Почему это так?

1 ответ

Решение

Я нахожу решение.

Мне нужно установить объект календаря в NSDateCompoent объект перед вызовом date:

NSDateComponents *dupComponents = [dupCal components:val fromDate:fromDate];

[dupComponents setCalendar:dupCal]; // THIS IS THE SOLUTION

return [dupComponents date]; 
Другие вопросы по тегам