-1

時刻を午前 12:00:01 に設定して日付を作成しようとしています。秒と分は正しく値に設定されていますが、時間の値は常に、私が設定した値 + 4 になります。なぜ 4 なのですか? その価値の何がそんなに特別なのですか?分と秒の値は正しく設定されていますが、時間の値は置き換えではなく単純に追加されているようです。

ここにコードがあります、

        NSDate *now = [NSDate date];
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now];
        [components setHour:0];
        [components setMinute:0];
        [components setSecond:1];

        NSDate *compareTime = [calendar dateFromComponents:components];
        NSLog(@"compareTime: %@", compareTime);
        NSLog(@"currentTime: %@", now);

出力は次のとおりです。

比較時間: 2013-05-17 04:00:01 +0000

currentTime: 2013-05-17 15:00:37 +0000

4

3 に答える 3

0

問題は、日付は正しいのに、デバイスのタイム ゾーンを基準とした UTC で記録されているため、混乱しているように見えることです。(最初はそうです)

あなたの比較時間は正しいです。それはあなたの時間の真夜中に設定され、UTC として出力されます。EST 真夜中の場合、UTC の午前 4 時になります。

compareTime: 2013-05-17 04:00:01 +0000

現在時刻も正確で、デバイスのタイム ゾーンを基準とした UTC 時間です。

currentTime: 2013-05-17 15:00:37 +0000

あなたの時間は正しいです、それはあなたをだましている出力です。

このコード (下にリストされているスレッドから恥ずべきことに盗用されたもの) は、compareTimeの UTC 日付を として出力する必要があります00:00:01 +0000。ただし、日付の計算では UTC で問題ありません。

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

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

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

さらに説明するのに役立ついくつかのSOスレッドを次に示します。

于 2013-05-17T15:58:17.260 に答える
0

NSDates は、タイムゾーンとは無関係に存在します。アプリケーションで 12:00:01 を表示する日付が必要な場合は、NSDateFormatter を使用する必要があります。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterFullStyle];

NSLog(@"formattedTime: %@", [dateFormatter stringFromDate:compareTime]);

これは以下を返します:

formattedTime: 12:00:01 AM Central Daylight Time
于 2013-05-17T15:11:56.893 に答える