カナデKanade

タイムゾーン(timezoneパッケージ)

timezoneパッケージで、都市ごとに違う時刻と夏時間を扱いましょう。

11章の【日時】はコンピューターに合わせたタイムゾーンしか使えません。ソウルの時刻をニューヨークの時刻に変えたり、夏時間のある都市の曜日を調べたりするには、タイムゾーンを自分で選ぶ必要があります。そのときに使うのがtimezoneパッケージです。Hanaランタイムに一緒に入っていて、タイムゾーンのデータ(IANAタイムゾーンデータベース)がパッケージの中にあるので、コンピューターに別途インストールするものはありません。ただしブラウザには入っていないので、このドキュメントの実行ボタンでは使えません。

【日時】と同じように【timezone】から〈道具〉を持ってこようで持ってきます。時刻は【日時】と同じUnix秒(数字)で、書式はYYYY MM DD HH mm ssがそれぞれ年・月・日・時・分・秒を表す文字列です。

道具 できること
〈時間帯書式〉(時刻, 書式, 時間帯) そのタイムゾーンの時計で、時刻を文字列に書きます
〈時間帯読み取り〉(文字列, 書式, 時間帯) そのタイムゾーンの時計で書かれた文字列を、時刻として読み取ります
〈時間帯曜日〉(時刻, 時間帯) そのタイムゾーンのカレンダーで曜日を教えます(月曜日1~日曜日7)
〈時間帯オフセット〉(時刻, 時間帯) その時刻にタイムゾーンがUTCより何秒進んでいるかを教えます(ソウルは32400)

タイムゾーンは「Asia/Seoul」、「America/New_York」のようなIANA名か、「UTC」、または「+09:00」・「-0530」のような固定オフセットです。コンピューターのタイムゾーンは選べません。どのコンピューターで実行しても同じ結果になるようにするためです。

【timezone】から〈時間帯書式〉を持ってこよう
【timezone】から〈時間帯曜日〉を持ってこよう

『時刻』を【数字】の1000000000にしよう
〈時間帯書式〉(『時刻』, 「YYYY-MM-DD HH:mm」, 「Asia/Seoul」)を出力しよう
〈時間帯書式〉(『時刻』, 「YYYY-MM-DD HH:mm」, 「America/New_York」)を出力しよう
〈時間帯曜日〉(『時刻』, 「America/New_York」)を出力しよう

同じ瞬間が、ソウルでは2001-09-09 10:46、ニューヨークでは2001-09-08 21:46で、ニューヨークはまだ土曜日なので曜日は6になります。夏時間もデータに入っているので、ニューヨークのオフセットは夏に-14400、冬に-18000です。昔の日付も、そのときの規則どおりに計算します。

【timezone】から〈時間帯読み取り〉を持ってこよう
【timezone】から〈時間帯オフセット〉を持ってこよう

〈時間帯読み取り〉(「2024-07-01 12:00:00」, 「YYYY-MM-DD HH:mm:ss」, 「Asia/Seoul」)を出力しよう
〈時間帯オフセット〉(〈時間帯読み取り〉(「2024-07-01 12:00:00」, 「YYYY-MM-DD HH:mm:ss」, 「America/New_York」), 「America/New_York」)を出力しよう

時計が飛んだり戻ったりするとき

夏時間が始まる日は、時計が1時間飛ぶので、その間の時刻は存在しません。ニューヨークの2024-03-10 02:30:00がそうです。このような文字列を読み取ろうとするとエラーになります。反対に夏時間が終わる日は、時計が1時間戻るので、同じ時刻が2回あります(2024-11-03 01:30:00)。このときは早い方を返します。

知っておくと便利なこと

  • タイムゾーン名を間違えたり(「Asia/Seol」)、空の文字列や「Local」を使ったりするとエラーになります。
  • 存在しない日付(2024-02-30)や、書式に合わない文字列を読み取ろうとするとエラーになります。
  • プログラムを実行ファイルにまとめても、このパッケージは一緒に入るので、まとめたプログラムでもタイムゾーン名をそのまま使えます。
プレイグラウンド
結果
コードを書いて「実行」ボタンを押してください。