MacとLinuxそれぞれでdateコマンド使って日付計算する

2021/11/14に公開

ターミナルでシェルワンライナー書くの楽しいですよね。
でも、MacとLinuxだとコマンドに差異があって、実行してみたら「そんなオプションはねえ」って怒られてしゅんってなった方大勢いらっしゃるんじゃないでしょうか。

これは、

  • Macにデフォルトで入っているコマンドがBSD版で、
  • LinuxはGNU版
  • という差から生まれる悲劇なわけですが、今回は日付計算が苦手な私がよく使うdateコマンドの日付計算で使う部分の差分だけをまとめてみます。

環境

  • macOS Big Sur 11.6
  • Docker 20.10.8
  • Ubuntu VERSION="20.04.3 LTS (Focal Fossa)"
    • imageとしてubunt:latestで適当に持ってきました

日時のフォーマット指定方法

こちらは基本的に共通の方法で指定可能です。

date '+%Y/%m/%d (%a)'
# 2021/11/14 (Sun)

Macのdateコマンドだと、フォーマットの指定に使える書式文字列はstrftimeに準拠するのですが、ざっくり確認した感じ、GNUのdateコマンドでも同じ書式文字列が使えるようです。

  • strftimeマニュアル

http://www.koganemaru.co.jp/cgi-bin/mroff.cgi?sect=3&cmd=&lc=1&subdir=man&dir=jpman-13.0.2%2Fman&subdir=man&man=strftime

  • GNU dateコマンドマニュアル

https://linuxjm.osdn.jp/html/GNU_coreutils/man1/date.1.html

Macで日付計算する

日付計算をしたい場合、Macに入っているBSD版のdateコマンドでは以下を組み合わせて計算します。

  • -vオプションを使う
  • 加算したい場合は+を使う
  • 減算したい場合は-を使う
  • 単位の指定は
    • y・・・年
    • m・・・月
    • w・・・週
    • d・・・日
    • H・・・時
    • M・・・分
    • S・・・秒
# 109日後の表示する
date -v+109d '+%Y/%m/%d (%a)'
# 2022/03/03 (Thu)

Linuxで日付計算する

GNU版の場合はもっと直感的に記述することが可能です。

  • -dオプションを使う
  • 加算したい場合はagoを使わない
  • 減算したい場合はagoを使う
  • 単位の指定は以下。末尾にsをつけても動くみたい。日本人に優しい。
    • day・・・年
    • month・・・月
    • week・・・週
    • day・・・日
    • hour・・・時
    • minute・・・分
    • second・・・秒
# 109日後の表示する
date -d '109 days' '+%Y/%m/%d (%a)'
# 2022/03/03 (Thu)

参考

Discussion