コードには多くの問題があります。まず、Date
からString
に戻り、Date
に戻る理由はありません。第2に、String
をDate
に変換し、String
に独自のタイムゾーン情報が含まれている場合は、フォーマッタのtimeZone
を設定することは意味がありません。文字列のタイムゾーンは、関連するDate
を計算するときに使用されます。
- タイムゾーン情報が含まれていない日付/時刻文字列を解析する場合は、2つの場合があります。フォーマッタのタイムゾーンは、文字列の解釈に使用されます。 を
String
に変換するとき。フォーマッタのタイムゾーンは、日付から結果の文字列を生成するときに使用されます。
あなたは、単に特定のタイムゾーンでString
として任意のDate
を表示したい場合は、あなたが必要とするすべては、次のとおりです(en_USロケール用)
let date = Date() // some date
print("Original Date (in GMT): \(date)")
// Setup a formatter with a date and time style
let formatter = DateFormatter()
formatter.timeZone = TimeZone(secondsFromGMT: 3600 * 3) // the desired timezone
formatter.dateStyle = .long
formatter.timeStyle = .medium
let string = formatter.string(from: date)
print("GMT+3 style result: \(string)")
// For comparison, set the formatter to a specific format
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
let string2 = formatter.string(from: date)
print("GMT+3 format result: \(string2)")
出力:
オリジナル日(GMT):2017-10-28 20:53:59 +0000
GMT + 3スタイルの結果:2017年10月28日11:53:59 PM
GMT + 3フォーマットの結果:2017-10-28 23 :53 :59 +0300
いつでも変換する必要はありません。所望の出力を得るために、Date
からString
を作成するだけです。
デフォルトでは、DateFormatter
は現地時間で結果を示しています。他の特定のタイムゾーンに結果が必要な場合は、フォーマッタのtimeZone
を設定します。
Date
オブジェクトを印刷すると、UTC時刻(+0000)の日付が常に表示されます。多くの人々はこれによって混乱し、彼らが間違った日付を取っていると思っています。
[[NSDate date \]から数時間後に日付を取得する](https://stackoverflow.com/questions/8466744/getting-date-from-nsdate-date-off-by-a)の可能な複製-few-hours) –
日付にはタイムゾーンがありません。日付を印刷するときは、常にGMTが表示されます。 –
あなたの目標は不明です。あなたの入力は何ですか( 'Date'か' String')?あなたの望む出力( 'Date'か' String')は何ですか?タイムゾーンについて話すことは、 'String'に/から変換するときだけ意味があることに注意してください。 – rmaddy