2013-10-06 52 views
0

我試圖使用「NSDate for first day of the month」中提供的解決方案來獲取每月的第一天。從日曆組件創建NSDate時出現1個錯誤

我的代碼是在NSDate的類別:

- (NSDate *)firstDayInMonthOfDate { 
    NSCalendar* calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *comps = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:self]; 
    comps.timeZone = calendar.timeZone; 
    NSDate *startDate; 
    [comps setDay:1]; 
    startDate = [calendar dateFromComponents:comps]; 
    return startDate; 
} 

這就產生了前一個月的最後一天....例如:

self = date: 2013-11-02 22:00:00 

comps = <NSDateComponents: 0x749b4c0> 
     TimeZone: Europe/Bucharest (GMT+03:00) offset 10800 (Daylight) 
     Calendar Year: 2013 
     Month: 11 
     Leap month: no 
     Day: 1 

startDate = 2013-10-31 22:00:00 +0000 

因此,爲了得到正確的日期,我必須設置comps.day = 2。我只是不明白多餘的1來自哪裏。

[編輯]我想使用收集視圖單元格的日期,所以我想一個可靠的方式來獲取本月的第一個日期,例如。 2013-11-01

[編輯]使用NSDateFormatter打印日期給出了正確的結果(2013-10-31)。與PO和NSLog的問題是,他們沒有解釋時區正確右(2012-12-31 22:00 + 3H GMT = 2013-01-01上午12點!) 我建議的日期編程教程:http://rypress.com/tutorials/objective-c/data-types/dates.html

+2

*** TIME ZONE *** - 這是(至少)與過去兩個小時,這個問題的第二次。而且很多次重複。 –

+1

如果你只是複製和粘貼代碼,你不應該感到驚訝,如果你不明白。 – vikingosegundo

+0

[從\ [NSDate date \]關閉幾個小時獲取日期](http://stackoverflow.com/questions/8466744/getting-date-from-nsdate-date-off-by-a-few小時) –

回答

2

您的結果是正確的

NSLog(@"%@", startDate)po startDate在調試器 始終打印相對於GMT日期,

startDate = 2013-10-31 22:00:00 +0000 

是一樣的2013年11月1日在GMT + 2日00:00:00這是你的時區。

注意,您可以簡化你的代碼

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDate *startDate; 
[calendar rangeOfUnit:NSMonthCalendarUnit startDate:&startDate 
      interval:NULL forDate:self]; 
return startDate; 
+0

您好Martin R,感謝您的快速回復,但對於我如何更改我的代碼並不明顯。 –

+0

@AndreiNagy:我確信你的代碼到目前爲止是正確的。但要根據您的時區顯示日期*,您必須使用NSDateFormatter。 –

+0

@AndreiNagy - NSLog調用NSDate.description(),它總是返回相對於GMT的日期。 –

相關問題