2014-02-15 21 views
3

我想将NSDate从一个时区转换为另一个时区。NSTime:为什么[NSDateComponent date]在这里返回零?

这里是我的代码:

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

'[[NSCalendar currentCalendar]拷贝]'拷贝是不必要的。另外你为什么使用“C”函数而不是ObjectiveC方法? – zaph

+0

@Zaph时区更改只是暂时的和本地的。我不想更改'currentCalendar'。 –

+1

'[NSCalendar currentCalendar]'创建一个新的日历,所以这是创建一个新的日历,然后制作一个新日历的副本,然后释放新日历。它真的支付学习Objective-C内存管理。 – zaph

回答

17

我找出解决方案。

我需要调用date之前设置日历对象到对象NSDateCompoent:

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

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

return [dupComponents date];