エポック秒(UNIX時間)<->日付文字列 を手軽に変換するepoコマンド

5023 ワード

epo

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

$ 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 |

背景

最近、

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

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

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

インストール

brewで。

brew tap wtetsu/epo
brew install epo

もしくはバイナリをダウンロード

ソースコードはこちら

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時間すっ飛びます。-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 |

実装 (Rust)

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

使用ライブラリ:

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

他には、

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

みたいな感じです。