2012-01-04 65 views
1

在我的iOS應用程序中,我必須根據當前日期創建一週。NSDateComponents在2012年的第一週表現得很奇怪

這是一段代碼:

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setYear:year]; 
[components setWeek:week]; 
[components setWeekday:2]; 

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *date = [gregorian dateFromComponents:components]; 

在這種特殊情況下的一年是2012年和一週爲1。我希望日曆返回2012-01-02,因爲這是日期2012年1月1日星期一。但相反,它返回2012-12-30。

更新了時區:

NSDateComponents *components = [[NSDateComponents alloc] init];  
[components setYear:2012]; 
[components setWeek:1]; 
[components setWeekday:2]; 

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
[gregorian setTimeZone:[NSTimeZone localTimeZone]]; 
NSDate *date = [gregorian dateFromComponents:components]; 

仍然返回2012-12-30。

回答

-1

我發現這個代碼的行爲像您期望

[components setYearForWeekOfYear:year]; 
[components setWeekOfYear:week]; 
[components setWeekday:2]; 

它看起來合法的,但該文件沒有說太多,所以你要自己承擔風險使用它。^^

+0

除了2012年的第一個星期,它還是完美的。 – hufkens 2012-01-05 10:29:03

+0

@hufkens我認爲結果日期是2012-01-02當地方應用時區。你的結果是什麼? – tia 2012-01-05 11:46:55

+0

無論我將其添加爲時區,它總是會返回2012-12-30。我嘗試過:[格里高利setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@「GMT」]];或[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@「CET」]];或[gregorian setTimeZone:[NSTimeZone localTimeZone]]; – hufkens 2012-01-05 15:30:15