epo: 日付時刻とエポック秒(UNIX時間)の相互変換コマンド
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