私の質問は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質問されるのを避けるために、
は、ここではスクリーンショットです:
私は、日付と時間帯をユーザーに求めていると私は、これらの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メソッドだけを使って、数学を使わないアプローチを好むでしょう。
だから、どうすればこの方法を実装できますか?あなたの例では
「ゾーン化された日付」はなく、「日付」は絶対的な時刻です。 - あなたができることは、日付コンポーネント*(年月日時分秒)、タイムゾーン*、カレンダーから日付を作成することです* –
@MartinR私はそれを知っています。だからこそ私はこれをするのに苦労している。私はユーレカのフォームを使用しています。最初のテーブルの行は実際には 'DateTimeRow'ですが、' Date'しか取得できません。選択したタイムゾーンに応じて、この日付を新しい日付に変換したいと思います。 – Sweeper
私は現在それをテストすることはできませんが、ローカルタイムゾーンと他のタイムゾーンとの間のGMTオフセットの差*によって調整する必要があります。または、最初の変換のローカルタイムゾーンと2番目の変換の他のタイムゾーンを使用して、Date-> DateComponents-> Dateを変換することができます。 –