2017-10-28 10 views
-1

でGMT +3までの任意の時間に変換のみなるには何もGMT +3、など。GMT + 2 ,,私は、任意の時間を変換するために、UTCを希望スウィフト

私はこのコードを試みたが、成功しません

 let date = Date() 
     let formatter = DateFormatter() 

     formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z" 
     formatter.timeZone = TimeZone.current 

     let currentdate = formatter.string(from: date) 

     print("currentdate \(currentdate)") 


     let gmt = DateFormatter() 
     gmt.timeZone = TimeZone(secondsFromGMT: 3600*3) 
     gmt.dateFormat = "yyyy-MM-dd HH:mm:ss Z" 
     let gmtDate = gmt.date(from: currentdate)! 

     print("gmtDate -> \(gmtDate)") 

私はタイムゾーンの略語を試しましたが、同じ結果がGMTのみとなっています。

アイデア?

+0

[[NSDate date \]から数時間後に日付を取得する](https://stackoverflow.com/questions/8466744/getting-date-from-nsdate-date-off-by-a)の可能な複製-few-hours) –

+0

日付にはタイムゾーンがありません。日付を印刷するときは、常にGMTが表示されます。 –

+0

あなたの目標は不明です。あなたの入力は何ですか( 'Date'か' String')?あなたの望む出力( 'Date'か' String')は何ですか?タイムゾーンについて話すことは、 'String'に/から変換するときだけ意味があることに注意してください。 – rmaddy

答えて

2

コードには多くの問題があります。まず、DateからStringに戻り、Dateに戻る理由はありません。第2に、StringDateに変換し、Stringに独自のタイムゾーン情報が含まれている場合は、フォーマッタのtimeZoneを設定することは意味がありません。文字列のタイムゾーンは、関連するDateを計算するときに使用されます。

  1. タイムゾーン情報が含まれていない日付/時刻文字列を解析する場合は、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)の日付が常に表示されます。多くの人々はこれによって混乱し、彼らが間違った日付を取っていると思っています。

+0

ここでの最後のポイントはキーです(これはバグレポートでたくさんあります)。日付を印刷すると、日付自体にタイムゾーン情報が関連付けられていないため、常にUTCで表示されます。それが間違った日付であることを意味するわけではありません。違った解釈をしているだけです。 –

+0

ちょっとみんな、素晴らしい答えてくれてありがとう 1最後 @rmaddy私は私がカウントダウンにそれを使用したいと思いますので、変換後の日付ではなく、文字列 を持っている、そしてそれは、開始日と終了日を必要としています たいデータのすべての日付がGMT 3であるため、 変換せずにカウントダウンすると間違った結果が返されます... もう一度素晴らしいサポートに感謝します – GramXGram

+0

「Date 'あなたは'日付 'が必要です。変換するものは何もありません。 – rmaddy

関連する問題