NSDate
値を GMT 日付に変換する機能が必要です。
iPhone デバイスが使用している日付ロケール設定に関係なく、NSDate
値を GMT 形式の値に変換するにはどうすればよいですか?NSDate
NSDate
値を GMT 日付に変換する機能が必要です。
iPhone デバイスが使用している日付ロケール設定に関係なく、NSDate
値を GMT 形式の値に変換するにはどうすればよいですか?NSDate
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm";
NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
[dateFormatter setTimeZone:gmt];
NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
[dateFormatter release];
Cocoa での時間の操作は複雑になる場合があります。オブジェクトを取得するNSDate
と、それはローカル タイム ゾーンになります。[[NSTimeZone defaultTimeZone] secondsFromGMT]
GMT からの現在のタイムゾーンのオフセットを提供します。次に、これを行うことができます:
NSDate *localDate = // get the date
NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method
NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset;
NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval];
gmtDate
これで、GMT の正しい日付が表示されます。それを表示するには、NSDateFormatter
、具体的にはメソッドsetDateStyle
とsetTimeStyle
メソッドを見てください。を作成し、必要に応じて構成してから、適切にフォーマットされた文字列を取得するためにNSDateFormatter
呼び出します。stringFromDate:
ハワードの答えは正しいので、投票して受け入れてください。
参考までに、日付オブジェクトとローカライズされた日付表現の違いを説明すると便利だと思います。
多くのプログラミング言語では、日付オブジェクトを使用して一意の時点を表します。相対論的な議論を無視すると、どのように時間を測定するかに関係なく、どのような場合でも、すべての人にとって普遍的に等しい時点を定義できると想定できます。
各時点で一意のラベルを作成できれば、そのラベルを渡して明確に参照できます。日付オブジェクトの目的は、特定の時点の一意のユニバーサル ラベルとして機能することです。
このようなラベル付けスキームを構築する手法はいくらでも考えつくことができますが、各日付オブジェクトがそれをどのように選択するかは、それらを使用する人にとって重要ではありません。
例として、ユニバーサル イベント (太陽が爆発してから X 秒) からの数値オフセットを使用することが考えられます。
タイム ゾーンやロケールなどの複雑さに対処しなければならないのは、ある時点を取得して人間が読める文字列にシリアル化したい場合だけです...
(ローカルの日付文字列) + (日付フォーマッタ) => 時点
時点 + (日付フォーマッター) => (ローカル日付文字列)
すべての時点は普遍的です...ニューヨークの時点やgmtの時点などはありません.時点をローカル文字列に変換すると(日付フォーマッタを使用して)、タイムゾーンへの関連付けが表示されます.
注:この問題に関する多くのブログ/記事があると確信していますが、私のGoogle fooはこの時間に失敗しています。誰かがこの問題を拡大したいという熱意を持っている場合は、遠慮なくそうしてください。
アレックスの答えは良いスタートでしたが、DST (夏時間) を扱っておらず、基準日との間の不要な変換を追加しました。以下は私にとってはうまくいきます:
DST を考慮して localDate から GMT に変換するには:
NSDate *localDate = <<your local date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:localDate];
NSDate *gmtDate = [localDate dateByAddingTimeInterval:-timeZoneOffset]; // NOTE the "-" sign!
DST を考慮して GMT 日付を localDate に変換するには:
NSDate *gmtDate = <<your gmt date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:gmtDate];
NSDate *localDate = [gmtDate dateByAddingTimeInterval:timeZoneOffset];
1 つの小さなメモ: iOS 4 のみである dateByAddingTimeInterval を使用しました。OS 3 以前を使用している場合は、addTimerInterval を使用します。
NSDateFormatter のドキュメントを見てみましたか?
NSDateFormatter には、特に TimeZones を操作するためのメソッドがいくつかあるようです。
-setTimeZone:
自分でテストしたことはありませんが、元は別のタイムゾーンで表されていた日付のタイムゾーンとして GMT を設定すると、新しいタイムゾーンに一致するように日付が正しく調整されて表示されると思います。