質問: Webアプリケーションを作成中で、web側をJavascript、DB側をGoを使って書いています。 Web側で時間を選択して、それをGoに送るのですが、web側で選ぶ時はローカルタイムなので、仮に日本ならばその時は2019-08-22T18:28:44+09:00となります。これをDB側に送る際に自動的にString型に変換され(送る時は必ずString型になる)、Goでtime.Parseを使い、時間型に変換しなおしています。 ``` t, _ := time.Parse("2006-01-02T15:04:05-07:00", "2019-08-22T18:28:44+09:00") //2019-08-22 18:28:44 +0900 JST fmt.Println(t.UTC()) //2019-08-22 09:28:44 +0000 UTC ``` この書き方で一応ローカルタイムをUTC時間に変更できるようですが、この時にサマータイムなどは考慮されて変換されるのでしょうか?1時間の差なので、そこまで気にはしませんが、もしサマータイムなども考慮して変換する方法があれば教えてください。 UTCへの変換はGoで行なっていますが、JavaScript側でも大丈夫です。UTCに変換したものをString型で送れば良いので。 どうぞよろしくお願いいたします。
回答: `2019-08-22T18:28:44+09:00` という文字列にはタイムゾーンオフセットの情報が入っていますが、タイムゾーンそのもの(JSTやKSTなど)の情報が欠落しています。タイムゾーンの情報がないため夏時間を考慮することはできず、「タイムゾーンオフセットをローカル時間から引けばUTCの時刻になる」という計算だけが可能です。タイムゾーンオフセットを得るときに夏時間を考慮する必要があります。 `Ext.Date.format()` では `Date.prototype.getTimezoneOffset()` が使われているようです。 `getTiemzoneOffset()` は、その`Date`オブジェクトが表すローカル日時に従ったオフセット値を返すようECMA Scriptの仕様で決められています。夏時間にも対応しています。よって、`Date`オブジェクトにローカルの日付を設定したあとに`getTimezoneOffset()`を呼べば夏時間対応はできていることになります。