時差を調べる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月頃だったようである。すでに内容が古くなっていたため、現在の仕様に合わせて記事を修正した。