時差を調べるUNIXコマンド (シェルスクリプト) を作ってみた


はじめに

海外の「現地時間は今何時」を知りたいことはよくある話である。単純に現在の時刻を調べるのであれば、世界時計を眺めれば済む話で、Webサービスも多数ある。ところが「現地時間の午前9時は日本時間の何時」とか知りたい場合は意外に調べやすくない。スマホにある世界時計の機能も、現在時刻を知るのは簡単だが、今の時間とは違う時間については容易ではない。

自分は普段シェルのコマンドラインを利用していることが多いので、時差をコマンドラインで表示するツールが欲しくなったということもあって作ってみた tzdiff コマンドを紹介する。

この記事の公開の段階では、コマンド名は timediff だったが、別のコマンドとコマンド名が被ることが判明したため、tzdiff という名前に変更した。(2018-09-04 更新)

tzdiff のダウンロード

tzdiff の使い方

tzdiff を引数無しで実行すると、/usr/share/zoneinfo の 一覧が得られる

$ tzdiff
Africa/         Australia/      Etc/            MST             WET
America/        CET             Europe/         MST7MDT         posixrules
Antarctica/     CST6CDT         Factory         PST8PDT         zone.tab
Arctic/         EET             HST             Pacific/
Asia/           EST             Indian/         SystemV/
Atlantic/       EST5EDT         MET             UTC

この中から Australia を指定する。

$ tzdiff Australia
Australia/Adelaide      Australia/Darwin        Australia/Lord_Howe
Australia/Brisbane      Australia/Eucla         Australia/Melbourne
Australia/Broken_Hill   Australia/Hobart        Australia/Perth
Australia/Currie        Australia/Lindeman      Australia/Sydney

さらに Australia/Sydney を指定すると、時差が10時間分表示される。

$ tzdiff Australia/Sydney
Australia/Sydney
2018-08-17 16:18 AEST   2018-08-17 15:18 JST
2018-08-17 17:18 AEST   2018-08-17 16:18 JST
2018-08-17 18:18 AEST   2018-08-17 17:18 JST
2018-08-17 19:18 AEST   2018-08-17 18:18 JST
2018-08-17 20:18 AEST   2018-08-17 19:18 JST
2018-08-17 21:18 AEST   2018-08-17 20:18 JST
2018-08-17 22:18 AEST   2018-08-17 21:18 JST
2018-08-17 23:18 AEST   2018-08-17 22:18 JST
2018-08-18 00:18 AEST   2018-08-17 23:18 JST
2018-08-18 01:18 AEST   2018-08-18 00:18 JST

このように引数に知りたい地域の Time Zone を指定するだけである。デフォルトでは今の時間から10時間分表示するが、24時間分表示したいのであれば、最後に数字の引数を指定する。

$ tzdiff America/New_York 24
America/New_York
2018-08-16 22:02 EDT    2018-08-17 11:02 JST
2018-08-16 23:02 EDT    2018-08-17 12:02 JST
2018-08-17 00:02 EDT    2018-08-17 13:02 JST
2018-08-17 01:02 EDT    2018-08-17 14:02 JST
2018-08-17 02:02 EDT    2018-08-17 15:02 JST
2018-08-17 03:02 EDT    2018-08-17 16:02 JST
2018-08-17 04:02 EDT    2018-08-17 17:02 JST
2018-08-17 05:02 EDT    2018-08-17 18:02 JST
2018-08-17 06:02 EDT    2018-08-17 19:02 JST
2018-08-17 07:02 EDT    2018-08-17 20:02 JST
2018-08-17 08:02 EDT    2018-08-17 21:02 JST
2018-08-17 09:02 EDT    2018-08-17 22:02 JST
2018-08-17 10:02 EDT    2018-08-17 23:02 JST
2018-08-17 11:02 EDT    2018-08-18 00:02 JST
2018-08-17 12:02 EDT    2018-08-18 01:02 JST
2018-08-17 13:02 EDT    2018-08-18 02:02 JST
2018-08-17 14:02 EDT    2018-08-18 03:02 JST
2018-08-17 15:02 EDT    2018-08-18 04:02 JST
2018-08-17 16:02 EDT    2018-08-18 05:02 JST
2018-08-17 17:02 EDT    2018-08-18 06:02 JST
2018-08-17 18:02 EDT    2018-08-18 07:02 JST
2018-08-17 19:02 EDT    2018-08-18 08:02 JST
2018-08-17 20:02 EDT    2018-08-18 09:02 JST
2018-08-17 21:02 EDT    2018-08-18 10:02 JST

毎時 0 時を指定したければ引数に 0 を追加する

$ tzdiff America/New_York 0
America/New_York
2018-08-16 22:00 EDT    2018-08-17 11:00 JST
2018-08-16 23:00 EDT    2018-08-17 12:00 JST
2018-08-17 00:00 EDT    2018-08-17 13:00 JST
2018-08-17 01:00 EDT    2018-08-17 14:00 JST
2018-08-17 02:00 EDT    2018-08-17 15:00 JST
2018-08-17 03:00 EDT    2018-08-17 16:00 JST
2018-08-17 04:00 EDT    2018-08-17 17:00 JST
2018-08-17 05:00 EDT    2018-08-17 18:00 JST
2018-08-17 06:00 EDT    2018-08-17 19:00 JST
2018-08-17 07:00 EDT    2018-08-17 20:00 JST

これなら一目瞭然で現地時間の 7:00 は日本時間の何時?というのがすぐにわかる。
また tzdiff America/New_York 24 0 のように毎時 0分で 24時間分という指定もできる。

都市の指定は、UNIX系OSで /usr/share/zoneinfo にある Time Zone Database をそのまま利用している。そのため "UTC", "Etc/GMT+9" なども指定できる。

さらに tzdiff ではちょっとしたコンプリーションもどきを実装して、使い勝手をよくしてある。

$ tzdiff Lon  ( ここで最後は Tab ではなく Return つまり引数に "Lon" を指定する。)
Arctic/Longyearbyen     Europe/London

都市名が 「Lon」で始まる都市の一覧が表示されるので、「Lond」まで指定すれば都市が確定する。

$ tzdiff Lond
Europe/London
2018-08-17 03:06 BST    2018-08-17 11:06 JST
2018-08-17 04:06 BST    2018-08-17 12:06 JST
2018-08-17 05:06 BST    2018-08-17 13:06 JST
2018-08-17 06:06 BST    2018-08-17 14:06 JST
2018-08-17 07:06 BST    2018-08-17 15:06 JST
2018-08-17 08:06 BST    2018-08-17 16:06 JST
2018-08-17 09:06 BST    2018-08-17 17:06 JST
2018-08-17 10:06 BST    2018-08-17 18:06 JST
2018-08-17 11:06 BST    2018-08-17 19:06 JST
2018-08-17 12:06 BST    2018-08-17 20:06 JST

今時のシェルはコマンドライン編集機能が充実しているので、このように操作するのは簡単なはずである。

また、指定した時刻からも調べられる。次の例は、アメリカ東海岸で2019年の夏時間から標準時間に切り替わる時間帯を表示している。

$ tzdiff -t 2018-11-04T10:00 New_
America/New_York
2018-11-03 21:00 EDT    2018-11-04 10:00 JST
2018-11-03 22:00 EDT    2018-11-04 11:00 JST
2018-11-03 23:00 EDT    2018-11-04 12:00 JST
2018-11-04 00:00 EDT    2018-11-04 13:00 JST
2018-11-04 01:00 EDT    2018-11-04 14:00 JST
2018-11-04 01:00 EST    2018-11-04 15:00 JST
2018-11-04 02:00 EST    2018-11-04 16:00 JST
2018-11-04 03:00 EST    2018-11-04 17:00 JST
2018-11-04 04:00 EST    2018-11-04 18:00 JST
2018-11-04 05:00 EST    2018-11-04 19:00 JST

同時に複数の都市も指定できる。ワールドワイドなテレカンの時間調整にはもってこいである。

$ tzdiff  Los New_ Brus 0
America/Los_Angeles     America/New_York        Europe/Brussels
2018-08-16 19:00 PDT    2018-08-16 22:00 EDT    2018-08-17 04:00 CEST   2018-08-17 11:00 JST
2018-08-16 20:00 PDT    2018-08-16 23:00 EDT    2018-08-17 05:00 CEST   2018-08-17 12:00 JST
2018-08-16 21:00 PDT    2018-08-17 00:00 EDT    2018-08-17 06:00 CEST   2018-08-17 13:00 JST
2018-08-16 22:00 PDT    2018-08-17 01:00 EDT    2018-08-17 07:00 CEST   2018-08-17 14:00 JST
2018-08-16 23:00 PDT    2018-08-17 02:00 EDT    2018-08-17 08:00 CEST   2018-08-17 15:00 JST
2018-08-17 00:00 PDT    2018-08-17 03:00 EDT    2018-08-17 09:00 CEST   2018-08-17 16:00 JST
2018-08-17 01:00 PDT    2018-08-17 04:00 EDT    2018-08-17 10:00 CEST   2018-08-17 17:00 JST
2018-08-17 02:00 PDT    2018-08-17 05:00 EDT    2018-08-17 11:00 CEST   2018-08-17 18:00 JST
2018-08-17 03:00 PDT    2018-08-17 06:00 EDT    2018-08-17 12:00 CEST   2018-08-17 19:00 JST
2018-08-17 04:00 PDT    2018-08-17 07:00 EDT    2018-08-17 13:00 CEST   2018-08-17 20:00 JST

一応簡単な ヘルプもある。

$ tzdiff -h
Usage: tzdiff [-0] [-n count] [-f format] [-t time] timezone [timezone ...] [count] [0]
        -0 : round down to hour
        -n : max hours (default: 10)
        -f : output format (using '+output_fmt' of 'date' command)
        -t : start time (YYYY-mm-ddThh:mm or YYYYmmddThhmm)
        more info: <https://github.com/belgianbeer/tzdiff>

動作環境

tzdiff そのものはシェルスクリプトであり、FreeBSD / NetBSD / OpenBSD / OS X / Debian / Ubuntu / CentOS での動作を確認している。UNIX系のOSであれば大部分のもので問題無く動作すると思われるが、date コマンドのオプションの違いで動かないものがあるかもしれない。その場合は GNU の date コマンドを用意すれば動くはずである。Windows の場合は、Windows Subsystem for Linux で利用できる。

おわりに

tzdiff の最初の版である timediff を作ったのは 2016年7月頃なので、すでに2年ほど経過し、機能追加や細かい修正を行っている。自分でも驚いたのだが Qiita に投降しようと下書きを書いたのが 2017年7月頃だったようである。すでに内容が古くなっていたため、現在の仕様に合わせて記事を修正した。