0

NSCalendar と NSDateComponents を使用して、2 つの日付の差 (日数) を返しています。これを取得するために使用しているコードは次のとおりです。

NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

NSDate *todayDate = [NSDate date];
NSDateComponents *comps = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) 
                                 fromDate:todayDate];
[comps setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDate *today = [calendar dateFromComponents:comps];

NSDate *startDate = self.date;
NSDate *endDate =  today;
NSLog(@"startDate: %@",startDate);
NSLog(@"endDate: %@",endDate);

NSDateComponents *components = [calendar components:NSDayCalendarUnit
                                            fromDate:endDate
                                              toDate:startDate
                                             options:0];
[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSInteger days = [components day];

奇妙な点は、これが 1 日の早い時間帯に完全に機能することですが、午後 6 時か 7 時頃 (私は GMT -7 である山岳標準時を使用しています) に達すると、正しく機能しなくなります。正しい差を返す代わりに、差から 1 日を引いた値を返します。たとえば、0 の代わりに -1 を返したり、2 の代わりに 1 を返したりします。

これはタイムゾーンの問題だと思います。誰もそれを修正する方法を知っていますか? NSCalendar の timeZone と NSDateComponents を GMT、ローカル、およびシステムに設定しようとしましたが、どれも機能していないようです。

何か案は?

ありがとうございました!

4

1 に答える 1

0

コードが日ごとのわずかな違いを処理していないようです。たとえば、開始日が昨日の午後 11 時 59 分で、終了日が今日の午前 12 時 1 分である場合、コードは差を 0 日として報告します。それが 1 日の違いであると考える場合、コードはそのケースを処理する必要があります。

日付ピッカーで self.date を選択している場合、self.date には日付と現在の現地時間が含まれます。現地時間の午後 6 時または午後 7 時は GMT の真夜中 (つまり、明日は現地時間の WRT) であり、差の計算で予期しない -1 が発生します。

于 2012-08-08T07:56:58.897 に答える