1

NSDate が UTC/GMT であることはわかっています。つまり、タイムゾーン情報は関連付けられていません。

タイムゾーンを考慮に入れる NSCalendar や NSTimeZone 、NSDateComponents などの高レベルのクラスがあります。

それに基づいて、次のコードを使用して、2 つの日付間の日数の差を計算しています。しかし、私が得ている結果は、時間を完全に無視して計算が行われたようです。私が何か間違ったことをしているのか、それともこれが何らかの理由で設計されているのか疑問に思っています.

コードとデータは次のとおりです。

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comp = [calendar components:NSDayCalendarUnit fromDate:startDate toDate:stopDate options:0];
NSInteger day = [comp day];

デバッグ出力:

(gdb) po startDate
2011-04-01 03:52:13 +0000
(gdb) po stopDate
2011-04-03 15:52:13 +0000
(gdb) p (int) day
$1 = 2

タイムゾーンは太平洋標準時で、上記の日付は PST に変換されたものです。

startDate = 2011-03-31 8:52:13 -7
stopDate  = 2011-04-03 8:52:13 -7

したがって、それらの間に 2 日ではなく 4 日あると予想します (31 日、1 日、2 日、および 3 日)。

時間が無視される理由は、計算に時間を追加すると 2 日と 12 時間が得られるからです。

私は何か間違ったことをしていますか、それともこれがどのように機能するように設計されていますか?

ありがとう、ヴァンス

4

1 に答える 1

0

そうではありません。太平洋タイム ゾーンで日付をフォーマットすると、次のようになります。

Calendars[38041:707] start: 2011-03-31 20:52:13 -0700
Calendars[38041:707] stop : 2011-04-03 08:52:13 -0700

これはあなたが投稿したものとは少し異なります。あなたのは、午後 8 時ではなく、午前 8 時を示しているようです。

また、はユニット全体components:fromDate:toDate:options:をカウントします。したがって、日数を尋ねている場合は、その間に丸 2 日あることになります。

おそらく、あなたが探していることを行うためのより良い方法はこれです:

NSUInteger startOrdinal = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:startDate];
NSUInteger stopOrdinal = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:stopDate];

その場合、それらの間の日数は になります(stopOrdinal - startOrdinal)。日付の場合、これは 3 になります (4 月 1 日 GMT - 4 月 3 日 GMT)。本当に時間部分を無視したい場合は、ターゲット タイムゾーン内の日付の時間部分を切り取る方法を見つけ出す必要があります。NSDateComponentこれには、日付をオブジェクトに変換し-hour、 、-minute、および-second部分を 0 に設定することが含まれます。それが完了したら、それらを に戻してNSDates、差の計算を続けることができます。

于 2011-11-20T03:40:07.703 に答える