2013-07-03 131 views
3

我想從週數和年份中獲取日期。我從服務器獲得了週數和年份。我是 嘗試下面的代碼,但它不會工作。如何從週數和年份獲取日期

NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init]; 
// this is imporant - we set our input date format to match our input string 
// if format doesn't match you'll get nil from your string, so be careful 
[dateFormatter2 setDateFormat:@"yyyy-MM-dd"]; 

NSDate *now = [dateFormatter2 dateFromString:@"2001-01-01"]; 
NSCalendar *gregorian1 = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *comps1 = [gregorian1 components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:now]; 


[comps1 setYear:2013]; 
[comps1 setWeek:51]; 
[comps1 setWeekday:2]; 

NSDate *resultDate = [gregorian1 dateFromComponents:comps1]; 

輸出是: - 2012-12-31 18:30:00 +0000

我到底做錯了什麼?在此先感謝..

+0

我剛剛跑過來,得到了不同的答案:'resultdate:2013-01-01 00:00:00 + 0000' – Robert

+1

也許'setWeekOfYear:'? (只是猜測) –

+1

還有這部分文檔:「使用帶日曆年和星期幾的NSCalendar時,使用使用基於星期的日曆常量創建的日曆會導致模糊的日期。」這聽起來像你可能會擊中那一個。 –

回答

5

你的問題是,你有你的NSDateComponents曖昧成分對象,因爲您是從現有NSDate創建組件的。把一個斷點在你的代碼,並期待在comps1

(lldb) po comps1 
$0 = 0x0ab354f0 <NSDateComponents: 0xab354f0> 
    Calendar Year: 2013 
    Month: 1 
    Leap month: no 
    Day: 1 
    Week (obsolescent): 51 
    Weekday: 2 

這是一種很難在51個星期是一月份,1日同時在星期一創建的日期。

當你想用NSDateComponents創建一個NSDate時,你應該從「新鮮」組件開始。就像這樣:

NSCalendar *gregorian1 = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *comps1 = [[NSDateComponents alloc] init]; 

[comps1 setYear:2013]; 
[comps1 setWeek:51]; 
[comps1 setWeekday:2]; 

NSDate *resultDate = [gregorian1 dateFromComponents:comps1]; 

結果:2013年12月16日(這是希望你所期望的)

是ALLOC inits組件的代碼以下組件:

(lldb) po comps1 
$0 = 0x0a37d220 <NSDateComponents: 0xa37d220> 
    Calendar Year: 2013 
    Leap month: no 
    Week (obsolescent): 51 
    Weekday: 2 

沒有歧義。

此外,將[comps1 setWeek:51];替換爲[comps1 setWeekOfYear:51];是個好主意但是,您的主要問題是重複使用現有的NSDateComponents對象。

+0

謝謝。你清除了我對日期組件的概念...... – Kalpesh

2

我得到了解決

NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init]; 
// this is imporant - we set our input date format to match our input string 
// if format doesn't match you'll get nil from your string, so be careful 
[dateFormatter2 setDateFormat:@"yyyy-MM-dd"]; 

NSDate *now = [dateFormatter2 dateFromString:@"2001-01-01"]; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
gregorian.firstWeekday = 2; // Sunday = 1, Saturday = 7 

NSDateComponents *components = [gregorian components:NSYearCalendarUnit |NSWeekdayCalendarUnit fromDate:now]; 
[components setYear:2013]; 
[components setWeekOfYear:18]; 
[components setWeekday:2]; 

NSDate *resultDate = [gregorian dateFromComponents:components]; 

輸出爲: - 2013年4月28日18:30:00 +0000

相關問題