0

destinationDate と components の結果が異なります。この問題を解決するにはどうすればよいですか?

NSTimeZone* sourceTimeZone      = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

NSDate* sourceDate              = [NSDate date];
NSInteger sourceGMTOffset       = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset  = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval         = destinationGMTOffset - sourceGMTOffset;

NSDate* destinationDate         = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];

NSCalendar *calendar            = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components    = [calendar components:(NSYearCalendarUnit  |
                                                        NSMonthCalendarUnit |
                                                        NSDayCalendarUnit   |
                                                        NSHourCalendarUnit  |
                                                        NSMinuteCalendarUnit|
                                                        NSSecondCalendarUnit) fromDate:destinationDate];

NSLog(@"%@", destinationDate); 
NSLog(@"%@", components);

2013-04-24 19:27:09 +0000

暦年: 2013 月: 4 閏月: なし 日: 25 時: 4 分: 27 秒: 9

4

2 に答える 2

5

日付 ( destinationDate) は GMT で印刷されます。ただし、カレンダーはローカル タイム ゾーンで作成されるため、日付コンポーネントはそうではありません。

試してみるとcalendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]、両方から同じ結果が得られます。そうしないと、差額が 2 回追加されます (1 回目はコードで、2 回目はカレンダーで)。

実際、あなたのコードはあまり意味がありません。NSDateタイム ゾーン情報を保持しないため、タイム ゾーンによって変更しないでください。NSDateは、タイム ゾーンに関係なく、常に特定の瞬間を表します。日付を文字列に変換する場合にのみ、日付を変換します。変換する場合は、NSCalendarまたはNSDateFormatter正しいタイム ゾーン セットを使用します。

次のコードは、システム (デフォルト) のタイム ゾーンで日付を出力するのに十分です。

NSDate* sourceDate              = [NSDate date];
NSCalendar *calendar            = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components = [calendar components:(NSYearCalendarUnit  |
                                                     NSMonthCalendarUnit |
                                                     NSDayCalendarUnit   |
                                                     NSHourCalendarUnit  |
                                                     NSMinuteCalendarUnit|
                                                     NSSecondCalendarUnit) fromDate:destinationDate];

NSLog(@"%@", sourceDate); 
NSLog(@"%@", components);
于 2013-04-24T12:03:13.560 に答える
1

NSDateComponents常にGMTの形式で日付を与えるので、以下のように配置するだけで現在の日付が得られます.

NSDateComponents *components    = [calendar components:(NSYearCalendarUnit  |
                                                            NSMonthCalendarUnit |
                                                            NSDayCalendarUnit   |
                                                            NSHourCalendarUnit  |
                                                            NSMinuteCalendarUnit|
                                                            NSSecondCalendarUnit) fromDate:[NSDate date]];

に置き換えdestinationDateます[NSDate date]

出力:

 2013-04-24 16:05:08 +0000

<NSDateComponents: 0x7e3e5b0>
    Calendar Year: 2013
    Month: 4
    Day: 24
    Hour: 16
    Minute: 5
    Second: 8
于 2013-04-24T10:36:51.780 に答える