1

私はこの質問が何百万回も尋ねられたことを知っています、私はただ解決策を見つけることができません。問題は次のとおりですNSDate。当月の初日の日付または翌月の初日の日付のいずれかを返すようにを変更しています。それは1つのことを除いてうまく機能しているようです:それは2または3時間を引いた時間を返します。

コード:

NSCalendar *theCalendar = [NSCalendar currentCalendar];
int comp = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *theComp = [theCalendar components:comp fromDate:date];
[theComp setTimeZone:[NSTimeZone systemTimeZone]];
switch (roundingMode) {
    case FIRST_OF_MONTH:
        [theComp setDay:1];
        return [theCalendar dateFromComponents:theComp];
    case FIRST_OF_NEXT_MONTH:
        [theComp setMonth:theComp.month+1];
        [theComp setDay:1];
        return [theCalendar dateFromComponents:theComp];
}

デバッガー(gdb)の出力は次のとおりです。

(gdb) po theComp
<NSDateComponents: 0x6e26170>
  TimeZone: Europe/Kiev (EET) offset 7200
  Calendar Year: 2012
  Month: 3
  Day: 1
(gdb) po date
2012-03-12 13:05:22 +0000
(gdb) po [theCalendar dateFromComponents:theComp]
2012-02-29 22:00:00 +0000

どんな助けでも大歓迎です。

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

4

1 に答える 1

5

日付はGMTで表示されます:2012-02-29 00:00:00 +00002012-03-01 22:00:00 +0200です。また、夏時間の変更を忘れないでください。これは、3時間の差が生じることがある理由を説明しています。

結果の日付は正しいですが、デバッガーはそれをGMTで表示します。

于 2012-03-12T14:16:18.630 に答える