3

ユーザーが入力した日付からGMT日付を計算する本番アプリケーションに次のコードがあります。

NSDate *localDate = pickedDate;
    NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method
    NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset;
    NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval];

このコードは、先週英国で恐ろしいサマータイムが施行されるまでは問題なく機能していました。

夏時間を考慮しながら日付を GMT に変換するにはどうすればよいですか?

4

1 に答える 1

6

NSDate は、絶対値からのオフセットを使用して時間間隔を表します。基準は GMT であり、すべての時間間隔は GMT です。これが違いがわかる理由です。日付の文字列表現が必要な場合 (データベースなどに保存する場合など)、NSDateFormatter を使用して、必要な特定のタイム ゾーンで作成します。

したがって、これは常に GMT の日付の文字列表現 (mysql に保存する場合など) を提供します (夏時間が考慮されます)。

NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; // e.g., set for mysql date strings
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSString* mysqlGMTString = [formatter stringFromDate:[NSDate date]];

これにより、ローカル タイム ゾーンに関係なく、GMT 時間で適切な日付文字列が得られます。また、NSDate と時間間隔で行うすべての相対測定は、GMT に基づいていることに注意してください。日付フォーマッタとカレンダー オブジェクトを使用して、それらをユーザーに提示するとき、またはカレンダーの計算を行う必要がある場合 (たとえば、サブスクリプションが明日期限切れになるという警告を表示するなど)、それらをより意味のあるものに変換します。

編集:タイムゾーンを追加するのを忘れていました! これがないと、フォーマッタはシステムのタイム ゾーンを使用します。

于 2010-04-06T00:08:56.220 に答える