2017-08-18 7 views
2

私の質問はGet "time with time zone" from "time without time zone" and the time zone nameとよく似ています(私はそう思います)。私はちょうどそれをスウィフトでやりたい。非ゾーン日付とタイムゾーンをどのように「結合する」のですか?

とにかく、私は次のシグネチャを持つ関数を記述しようとしています:

func combine(_ date: Date, with timeZone: TimeZone) -> Date? 

それは何することは、基本的に日付を取り込んで「ゾーン化」の日付を返すことです。タイムゾーンに日付が存在しない場合は、nilを返します。 XY質問されるのを避けるために、

は、ここではスクリーンショットです:

enter image description here

私は、日付と時間帯をユーザーに求めていると私は、これらの2つのいずれかにDateを結合したいです。

私は説明するために最善を尽くします。できるだけ明確にするために、日付をtimeIntervalFrom1970の形式で表現します。

私は日付として0を渡し、GMT-1はタイムゾーンとして渡すと、3600を返します。0は1970-1-1 00:00:00です。

return date.addingTimeInterval(-timeZone.secondsFromGMT(for: date)) 
:GMT-1で1970年1月1日00:00:00 3600

これは私がこれを実装しようとした方法であるGMT、で1970年1月1日午前1時00分○○秒であります

これはほとんどの場合に機能するようですが、すべてではありません。しかし、DSTが関与し、全体が乱雑になるならば、正しい結果を返すとは思えません。それはまた、「数学的」だと感じます。私は、Foundation APIメソッドだけを使って、数学を使わないアプローチを好むでしょう。

だから、どうすればこの方法を実装できますか?あなたの例では

+0

「ゾーン化された日付」はなく、「日付」は絶対的な時刻です。 - あなたができることは、日付コンポーネント*(年月日時分秒)、タイムゾーン*、カレンダーから日付を作成することです* –

+0

@MartinR私はそれを知っています。だからこそ私はこれをするのに苦労している。私はユーレカのフォームを使用しています。最初のテーブルの行は実際には 'DateTimeRow'ですが、' Date'しか取得できません。選択したタイムゾーンに応じて、この日付を新しい日付に変換したいと思います。 – Sweeper

+0

私は現在それをテストすることはできませんが、ローカルタイムゾーンと他のタイムゾーンとの間のGMTオフセットの差*によって調整する必要があります。または、最初の変換のローカルタイムゾーンと2番目の変換の他のタイムゾーンを使用して、Date-> DateComponents-> Dateを変換することができます。 –

答えて

1

、APIはあなたにDateを与えるが、あなたには、いくつかの特定の時間帯に「2017年8月18日午前8時08分」として それを解釈したいです。 ユーレカフォームのUIエレメントが現在のカレンダーのタイムゾーンを表示するために と表示されている場合は、DateComponentsに、そして をDateにタイムゾーンを変えて戻すことができます。日/時間の組み合わせが、他のタイムゾーンで 存在しない場合

func combine(_ date: Date, with timeZone: TimeZone) -> Date? { 
    var cal = Calendar.current 
    let comp = cal.dateComponents([.era, .year, .month, .day, .hour, .minute, .second], from: date) 
    cal.timeZone = timeZone 
    return cal.date(from: comp) 
} 

nilが返されます。

+0

"today 8:37:37"を選択すると、私は取得した日付を印刷します。それは「2017-08-18 07:37:37 +0000」です。デバイスのタイムゾーンはGMT + 1です。明らかに、APIは選択した日付をUTCに変換します。あなたが言ったように、これは現在のカレンダーのタイムゾーンを表示に使用していますか? – Sweeper

+0

次に、現在のカレンダーのタイムゾーンを表示用に使用するかどうかを決定する方法はありますか? – Sweeper

+0

どのターゲットタイムゾーンを選択しましたか?変換前と変換後の 'date'は何ですか? –

関連する問題