takashi kono's blog

コーヒーとキーボードと共に何かを記録していくブログ

linux で unixtime 日時 の相互変換 備忘録

コマンド

$ date --version
date (GNU coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 David MacKenzie。

現在の日時を unixtime にする

date +%s
#=> 1654665889

任意の日時を unixtime にする

date -Isecond
#=> 2022-06-08T14:25:48+0900
date +%s --date '2022-06-08T14:25:48+0900'
#=> 1654665948
date +%s --date '2022-06-08 14:25:48'
#=> 1654665948
echo 2022-06-08T14:25:48+0900 | date +%s --date --
#=> 1654614000

指定の時間に timezone をつけない場合、システムの timezone に依存して変換されるのかな?未確認

unixtime を日時にする

date --date @1654665948
#=> 2022年  6月  8日 水曜日 14:25:48 JST

unixtime を日時にするときにフォーマットする

date --date @1654665948 -Isecond
#=> 2022-06-08T14:25:48+0900
date --date @1654665948 +'%F %T'
#=> 2022-06-08 14:25:48

unixtime を日時にフォーマットしつつ、24時間前の日時にする

date --date @1654665948 +'%F %T' --date '1 day ago'
#=> 2022-06-07 14:33:17

ちなみに

date コマンドのよく使うオプション

date -I
#=> 2022-06-08
date -Isec
#=> 2022-06-08T14:35:20+0900
date -Ins
#=> 2022-06-08T14:37:22,024306763+0900
date --date '1 day ago' -Isecond # 2 days ago, 2 hours ago など指定できる
#=> 2022-06-07T14:37:44+0900
date +%F
#=> 2022-06-08
date +%T
#=> 14:38:40

ISO8601 フォーマットで出力されるのでとても楽
時刻に : コロンが入っていてファイル名にできないときは以下のようにしている

date +%F_%H-%M-%S
#=> 2022-06-08_14-39-50
# or
date +%FT%H-%M-%S
#=> 2022-06-08T14-40-12

感想

date コマンドってやはり使える!
便利なオプション増えてくれてとても助かる
--date オプションが複数同時につけれるとは思っていなかったので、発見である
-Isecond が長いな。と思っていたところ、 -Isec で出力されたのは驚いた

あれ?

もしかして、 -Is だけでも OK では?

date -Is
#=> 2022-06-08T14:47:54+0900

出力された
適当に間違ったオプションにして help を見る
(ごめんなさい🙇

$ date -Ix
date: `--iso-8601' に対する引数 `x' が間違っています
有効な引数:
  - `hours'
  - `minutes'
  - `date'
  - `seconds'
  - `ns'
Try 'date --help' for more information.

もしかして、この TIMESPEC の頭文字が重複していないから出力された可能性ある

$ date -Ih
2022-06-08T14+0900
$ date -Im
2022-06-08T14:50+0900
$ date -Id
2022-06-08
$ date -Is
2022-06-08T14:50:50+0900
$ date -In
2022-06-08T14:50:52,645656885+0900

なるほど。ミリ秒がなかったのは、 minutes と重複するからかな
面白い