0

「 NSDate for first day of the month 」で提供されているソリューションを使用して、月の初日を取得しようとしています。

私のコードは 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 10pm + 3h GMT != 2013-01-01 12am ) 日付プログラミングのチュートリアルをお勧めします: http://rypress.com /tutorials/objective-c/data-types/dates.html

4

1 に答える 1

2

あなたの結果は正しいです。

NSLog(@"%@", startDate)またはpo startDate、デバッガーで常に GMT に関する日付を出力し、

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

あなたのタイムゾーンである GMT+2 の 2013-11-01 00:00:00 と同じです。

コードを次のように単純化できることに注意してください。

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *startDate;
[calendar rangeOfUnit:NSMonthCalendarUnit startDate:&startDate
             interval:NULL forDate:self];
return startDate;
于 2013-10-06T08:03:08.113 に答える