2013-02-28 35 views
3

我想找出一個口的第一個星期的一年的日期將返回錯誤的日期NSCalendar dateFromComponents 2

2012-12-29 23:00:00 +0000 

當我與我的Mac日曆相比,我需要得到的是:

2012-12-31 23:00:00 +0000 

有什麼建議嗎?

回答

0

問題可能是設置weekDay 這裏是工作的代碼

NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *components = [[NSDateComponents alloc] init]; 
    [components setYear:2013]; 
    [components setMonth:1]; 
    [components setDay:1]; 

    NSDate *newDate = [calendar dateFromComponents:components]; 
    NSLog(@"%@",newDate); //2012-12-31 23:00:00 +0000 

其他替代你可以使用NSGregorianCalendar,而不是currentCalender

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
     NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]]; 
[comp setYear:2013]; 
[comp setMonth:1]; 
[comp setDay:1]; 
NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp]; 
NSLog(@"%@",firstDayOfMonthDate); // 2012-12-31 23:00:00 +0000 
+0

好,你可以接受的答案,如果它可以幫助你,其次我已編輯輸出的答案 – nsgulliver 2013-02-28 13:48:55

+0

問題是沒有使用NSGregorianCalendar而不是currentCalendar - 特別是setDay vs setWeekday;你的代碼*在這方面被改變了,但你在文中沒有提到。我建議你編輯以解釋之前發生的事情。 – 2013-02-28 13:53:31

+0

@JonSkeet在回答編輯 – nsgulliver 2013-02-28 14:00:58

4

(我知道現在你已經制定了什麼正在進行,但爲了未來的讀者...)

看看你在做什麼摹這裏:

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setYear:2013]; 
[components setMonth:1]; 
[components setWeekOfMonth:1]; 
[components setWeekday:1]; 

讓我們今天(2013年2月28日)爲例,看看我們每一步驟(假設後獲得;我不能檢查):

  • setYear:2013 - 沒有變化,因爲今年已經2013
  • setMonth:1 - 更改爲1月:2013年1月28日
  • setWeekOfMonth:1 - 改變當天2013年1月的第一個星期-of周(星期四):2013年1月3日
  • setWeekday:1 - 換到週日在同一個星期:2012-12-30

現在,當你打印出來l 2012年12月30日的ocal午夜,但在UTC,你會得到「2012-12-29 23:00:00 +0000」,因爲你的本地時區可能比UTC早1小時。

所以,當你已經建立了,你想setDay代替setWeekOfMonth/setWeekday,假設你真的想「1月1日」而不是「1週週日一月」。