CLOVER🍀

That was when it all began.

dateコマンドで、タイムゾーンをJST → UTC/UTC → JST(任意のタイムゾーン間)に変換して表示する

これは、なにをしたくて書いたもの?

dateコマンドで、あるタイムゾーンの時刻を別のタイムゾーンの時刻に変換して表示するにはどうしたらいいのかな?と思ってメモ。

その一例として、JSTとUTCを使って確認してみます。

環境

今回の環境は、こちら。

$ uname -srvmpio
Linux 5.4.0-122-generic #138-Ubuntu SMP Wed Jun 22 15:00:31 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux


$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.4 LTS
Release:        20.04
Codename:       focal

現在のタイムゾーン。JSTですね。

$ timedatectl
               Local time: 木 2022-08-04 22:59:57 JST
           Universal time: 木 2022-08-04 13:59:57 UTC
                 RTC time: 木 2022-08-04 13:59:57
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

現在時刻をUTC(別のタイムゾーン)で表示する

現在時刻。

$ date
2022年  8月  4日 木曜日 23:07:37 JST

UTCで表示するには、--utcまたは-uオプションを使用すればOKです。

$ date --utc
2022年  8月  4日 木曜日 14:07:50 UTC


$ date -u
2022年  8月  4日 木曜日 14:07:54 UTC

TZ環境変数を使う方法もあります。

$ TZ=UTC date
2022年  8月  4日 木曜日 14:08:45 UTC

TZ環境変数を使った方法は、manページにも書かれています。

   Show the time on the west coast of the US (use tzselect(1) to
   find TZ)

         $ TZ='America/Los_Angeles' date

date(1) - Linux manual page

というわけで、現在時刻を別のタイムゾーンで表示するには、TZ環境変数を使えば良さそうです。UTCに限っては、--utc(-u)オプションが
使えるということですね。

指定したタイムゾーンの時刻を、別のタイムゾーンに変換して表示する

dateコマンドは、--dateまたは-dで指定した時刻を表示することができます。この時に指定した時刻のタイムゾーンと、コマンドの結果として
表示するタイムゾーンを変更してみたいと思います。

表示時には、フォーマットも指定してみましょう。

JST → UTC。

$ date --date '2022-08-04 23:15:40 JST' --utc '+%Y-%m-%d %H:%M:%S %Z'
2022-08-04 14:15:40 UTC

先ほどと同様、--utcオプションを使えばOKです。

TZ環境変数を使う例。

$ TZ=UTC date --date '2022-08-04 23:15:40 JST' '+%Y-%m-%d %H:%M:%S %Z'
2022-08-04 14:15:40 UTC

manページを見ていて気づいたのですが、--dateオプションで時刻を与える場合は、この中にTZ環境変数を含めてもよいみたいですね。

$ date --date 'TZ="Asia/Tokyo" 2022-08-04 23:15:40' --utc '+%Y-%m-%d %H:%M:%S %Z'
2022-08-04 14:15:40 UTC

この場合、JST指定は不要になります。

   Show the local time for 9AM next Friday on the west coast of the
  US

         $ date --date='TZ="America/Los_Angeles" 09:00 next Fri'

date(1) - Linux manual page

今度は、UTC → JST。

$ TZ=Asia/Tokyo date --date '2022-08-04 14:15:40 UTC' '+%Y-%m-%d %H:%M:%S %Z'
2022-08-04 23:15:40 JST


$ TZ=Asia/Tokyo date --date 'TZ="UTC" 2022-08-04 14:15:40' '+%Y-%m-%d %H:%M:%S %Z'
2022-08-04 23:15:40 JST

こちらは、TZ環境変数を使うパターンのみです。

ちょっとした小ネタとして、覚えておくと便利なのかな、と思います。