12

2011 年 11 月 6 日になっても、なぜ日が変わらないのか理解できないようです。どんな助けでも大歓迎です。これが私のコードです:

NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents* comp = [[NSDateComponents alloc] init];

[comp setDay:2];
[comp setMonth:11];
[comp setYear:2011];

NSDate* date = [calendar dateFromComponents:comp];

for (int i = 0; i < 7; i++) {
    NSDate* d = [date dateByAddingTimeInterval:((3600 * 24) * i)];
    NSDateComponents* dComponents = [calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:d];

    int day = [dComponents day];
    NSLog(@"\nDate: %@\nDay: %i", [d description], day);
}

これは私の出力です:

Date: 2011-11-02 06:00:00 +0000
Day: 2

Date: 2011-11-03 06:00:00 +0000
Day: 3

Date: 2011-11-04 06:00:00 +0000
Day: 4

Date: 2011-11-05 06:00:00 +0000
Day: 5

Date: 2011-11-06 06:00:00 +0000
Day: 6

Date: 2011-11-07 06:00:00 +0000
Day: 6

Date: 2011-11-08 06:00:00 +0000
Day: 7

ありがとう!

4

2 に答える 2

20

11 月 6 日は、デイ セービング タイムのために時刻が変更された日であるため、その日は実際には 25 時間続くため、誤った結果が生じる可能性があります (一般に、日付に時間間隔を追加することは、カレンダーの不規則性と動作に依存する可能性があるため、信頼できません)。多くのパラメーター: 現在のカレンダー、タイム ゾーン、ロケール設定など)。

日を反復するより正しい方法 (wwdc11 ビデオ「Performing Calendar Calculations」 (iTunes リンク) による) は、各反復の開始日に適切な数の日付コンポーネントを追加することです。

...
NSDateComponents *addComponents = [[NSDateComponents alloc] init];
for (int i = 0; i < 7; i++) {
    [addComponents setDay: i];
    NSDate* d = [calendar dateByAddingComponents:addComponents toDate:date options:0];        
     NSDateComponents* dComponents = [calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:d];

     int day = [dComponents day];
     NSLog(@"\nDate: %@\nDay: %i", [d description], day);
}
于 2011-07-30T21:10:15.407 に答える