⏲️

epo: 日付時刻とエポック秒(UNIX時間)の相互変換コマンド

2022/05/06に公開

epo

エポック秒(UNIX時間)<->日付時刻文字列 を、タイムゾーンも考慮しつつ手軽に変換できるepoというコマンドを作ってみました。

  • エポック秒(UNIX時間)<->日付文字列 相互変換
  • UTCオフセット(e.g. +0900)、tz database表記(e.g. Asia/Tokyo, America/New_York)、どちらも指定可能
  • 複数の時間やタイムゾーンを一度に指定可能で、出力はマークダウンのテーブル表記となる
  • ちょっとしたJavaScriptで計算を書くことも可能
$ epo 1648771200 1648771200+86400 los_angeles +0900
|      Epoch |      America/Los_Angeles |                    +0900 |
| ---------- | ------------------------ | ------------------------ |
| 1648771200 | 2022-03-31T17:00:00-0700 | 2022-04-01T09:00:00+0900 |
| 1648857600 | 2022-04-01T17:00:00-0700 | 2022-04-02T09:00:00+0900 |

インストール

Macのひとはbrewで。

brew tap wtetsu/epo
brew install epo

Windows等はバイナリをダウンロード

ソースコードはこちら

使い方

UNIX時間 → 日付文字列

基本的にはUNIX時間を指定するだけ。

$ epo 1648771200
|      Epoch |                    +0900 |
| ---------- | ------------------------ |
| 1648771200 | 2022-04-01T09:00:00+0900 |

複数UNIX時間 x 複数タイムゾーン。

$ epo 1648771200 1648771200+86400 "1648771200+86400*2" greenwich +0900 new_y
|      Epoch |                Greenwich |                    +0900 |         America/New_York |
| ---------- | ------------------------ | ------------------------ | ------------------------ |
| 1648771200 | 2022-04-01T00:00:00+0000 | 2022-04-01T09:00:00+0900 | 2022-03-31T20:00:00-0400 |
| 1648857600 | 2022-04-02T00:00:00+0000 | 2022-04-02T09:00:00+0900 | 2022-04-01T20:00:00-0400 |
| 1648944000 | 2022-04-03T00:00:00+0000 | 2022-04-03T09:00:00+0900 | 2022-04-02T20:00:00-0400 |

オプションは順序を問いません。また、計算式を書くこともできます。86400を足せば一日後になります。

tz databaseな名前でタイムゾーンを指定するときは、前方一致で絞れればOKです(ここでは"new_y"はAmerica/New_Yorkとみなされる)


また、ちょっとしたJavaScriptを書くことができます(boaを組み込んでみました)

epo "range(10).map(i=>1647165300+i*60)" los_angeles phoenix

出力はMarkdownテーブルでもあるので、そのままここに貼り付けることもできます。

Epoch America/Los_Angeles America/Phoenix
1647165300 2022-03-13T01:55:00-0800 2022-03-13T02:55:00-0700
1647165360 2022-03-13T01:56:00-0800 2022-03-13T02:56:00-0700
1647165420 2022-03-13T01:57:00-0800 2022-03-13T02:57:00-0700
1647165480 2022-03-13T01:58:00-0800 2022-03-13T02:58:00-0700
1647165540 2022-03-13T01:59:00-0800 2022-03-13T02:59:00-0700
1647165600 2022-03-13T03:00:00-0700 2022-03-13T03:00:00-0700
1647165660 2022-03-13T03:01:00-0700 2022-03-13T03:01:00-0700
1647165720 2022-03-13T03:02:00-0700 2022-03-13T03:02:00-0700
1647165780 2022-03-13T03:03:00-0700 2022-03-13T03:03:00-0700
1647165840 2022-03-13T03:04:00-0700 2022-03-13T03:04:00-0700

上記はAmerica/Los_Angelesがサマータイムに入るタイミングを確認することができます。夏時間に入る時は、1時間すっ飛びます。1647165600の時点で、-0800が-0700になり、突然03:00になっていることがわかると思います。ちなみにAmerica/Phoenixはアメリカですがサマータイムが採用されていない地域として知られており、ずっと-0700のままです。

日付文字列 → UNIX時間

ISO8601っぽい形式を適宜解釈します。

$ epo 2022-04-01 2022-05-01T12:30 2022-06-15T12:30:45 tokyo hawaii gmt
|                Date | Asia/Tokyo |  US/Hawaii |        GMT |
| ------------------- | ---------- | ---------- | ---------- |
| 2022-04-01T00:00:00 | 1648738800 | 1648807200 | 1648771200 |
| 2022-05-01T12:30:00 | 1651375800 | 1651444200 | 1651408200 |
| 2022-06-15T12:30:45 | 1655263845 | 1655332245 | 1655296245 |

背景

動機

最近、

  • 目の前にあるUNIX時間な数値を、手元でサッと人間が読める形式に変換したい
  • 複数タイムゾーンを考慮したい

という状況がしばしば発生し、ややこしいdateコマンドのオプションを扱ったり、Pythonで書いた簡易ツールで対処していたりしたのですが、せっかくなのである程度汎用的で簡単に使えるコマンドラインツールとして作ってみようかなと思いました。

というのが理由の半分で、Rust勉強用の題材としてちょうどいいかなと考えたのも大きな理由です。

実装 (Rust)

これ作った目的の半分以上がRustの勉強目的なのでRustで書きました。Rustでなんらかの実用的なものを作るのは初めてなので基本的なことを調べる時間などは必要でしたが、特別なにかにものすごくハマったみたいなことはありませんでした(ちゃんとRustっぽく書けているかはイマイチ不明ですが)

使用ライブラリ:

  • chrono: 日付の扱い
  • once_cell: lazy的なやつの扱い
  • boa: JavaScriptエンジン

他には、

  • GitHub上での各プラットフォーム用ビルド(Windows, OSX, Linux)
  • テストカバレッジ (Tarpaulin + Codecov)

みたいな感じです。

Discussion