tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【Mac】dateコマンドでunixtime <=> 日時 文字列を相互に変換するメモ

はじめに

何らかのシステムに携わっているときって扱う日付がunixtimeな時多いですよね。

例えば下記のようなときにMacでささっと変換できたら便利だと思います。

  • unixtimeなシステムで、データ確認のために人間がわかる表示で日時を確認したい
  • unixtimeなシステムに、debugのために現在日付をunixtimeに変換して入れたい

そういうwebサイトもありますがわざわざ検索して開いて入力して変換して、、、
というのもあれですしそんな時に手元でささっと変換するメモ。

アジェンダ

  1. dateコマンドそのもの
  2. dateコマンドでunixtimeを日時文字列に変換する
  3. dateコマンドで日時文字列をunixtimeに変換する

1. dateコマンドそのもの

dateコマンドはそのまま打つとosの現在日時を表示してくれます。

$ date
2016年 11月28日 月曜日 14時04分39秒 JST

utc時刻を得たいときは-uオプションで表示できます。

# まんま表示
$ date
2016年 11月28日 月曜日 14時05分51秒 JST

# UTCで表示
$ date -u
2016年 11月28日 月曜日 05時05分51秒 UTC

また、1日前1日後もオプションで指定することで表示できます。

# 今
$ date
2016年 11月28日 月曜日 14時09分08秒 JST

# 1日後
$ date -v +1d
2016年 11月29日 火曜日 14時09分08秒 JST

# 1日前
$ date -v -1d
2016年 11月27日 日曜日 14時09分08秒 JST

dateコマンドではないですが、calと打てばカレンダーで前後の日付も確認できますね。

$ cal
     11月 2016
日 月 火 水 木 金 土
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

そしてunixtimeで表示したい場合は ``をつけます

$ date +%s
1480310097

2. dateコマンドでunixtimeを日時文字列に変換する

ということで本題です。

これは簡単で-rオプションに続けてunixtimeを指定すると人間がわかる日時の文字列に変換してくれます。

$ date +%s
1480310553

$ date -r 1480310553
2016年 11月28日 月曜日 14時22分33秒 JST

なんとなく見にくいという場合はフォーマットも指定できます。

$ date -r 1480310553 +"%Y/%m/%d %H:%M:%S"
2016/11/28 14:22:33

3. dateコマンドで日時文字列をunixtimeに変換する

日時文字列からunixtimeへの変換はプログラムなんかでもよくある形を使います。
日付文字列を指定しますが、合わせてマシンがその文字列を理解できるようにフォーマット文字列も添えてあげます。

# 日時文字列をunixtimeに変換する
$ date -j -f "%Y-%m-%d %H:%M:%S" "2016-11-28 14:22:33" "+%s"
1480310553

# 変換したunixtimeを戻してみる
$ date -r 1480310553
2016年 11月28日 月曜日 14時22分33秒 JST

-jオプションは詳細は、
PCの日付を変更してしまうので要注意と書いてあったりしますが権限がなければこんな感じでエラーになるので仮に忘れてもまぁ、、、

$ date -f "%Y-%m-%d %H:%M:%S" "2016-11-28 14:22:33" "+%s"
date: bind: Permission denied
date: settimeofday (timeval): Operation not permitted

まとめ

manを見ればわかりますがここまでで使ったオプションは下記のみです。

# `-u` : UTCで表示
$ date -u
2016年 11月28日 月曜日 05時05分51秒 UTC

# -v :-vに続けて`[+-](数値)(単位)`とすることで`n(単位)[前後]`を表示
# (例えば`n日前`とか)
$ date -v +1d
2016年 11月29日 火曜日 14時09分08秒 JST

# +%s : unixtimeを表示
$ date +%s
1480310097

# -r : -rに続けてunixitmeを指定
# フォーマットは`+"フォーマット文字列"`で
$ date -r 1480310553 +"%Y/%m/%d %H:%M:%S"
2016/11/28 14:22:33

# -j -f : -j -fに続けてフォーマット、日付文字列、+%s
$ date -j -f "%Y-%m-%d %H:%M:%S" "2016-11-28 14:22:33" "+%s"
1480310553

必要そうだったらフォーマットを毎回指定するのは面倒なのでaliasにしちゃってもよいかもしれませんね。

参考

おわり

書いたものの、コレ系は使う機会になるたびに調べてはを繰り返してるので
今後はここに来てさっと知りたい情報が得れれば自分的にはオッケーという自分めもでした