2012/12/27
指定された日の曜日を取得する
先日開催された 第2回チキチキ!シェル芸人養成勉強会 の課題の中で自分の中で話題になった事。
指定された日の曜日を取得したい場合、 gnu 版の date (1) がインストールされている場合は 以下のコマンドで取得可能(0 が日曜日を示す)。
$ date -d YYYYMMDD '+%w' 0gnu 版の date (1) がインストールされていない場合でも、 FreeBSD 版の date (1) は独自拡張されているので 以下のコマンドで取得可能だと言う事を教わった(0 が日曜日を示す)。
$ date -j YYYYMMDDHHMM '+%w' 0
但しどちらも posix に準拠していない独自拡張な機能を利用しているため
環境依存となってしまうので、
環境に依存しない方法での解決方法を考えてみた。
日付から曜日を取得するためには ツェラーの公式
という計算式があるので、
posix に準拠したシェルの機能だけでその計算式を実装してみる。
$ y=YYYY; m=MM; d=DD $ test $m -lt 3 && y=$(($y - 1)) && m=$(($m + 12)) $ echo $(($(($y + $y/4 - $y/100 + $y/400 + $(($((13 * $m + 8))/5)) + $d)) % 7))年と月の値によって調整が必要なのでワンライナーにはならないのが残念だけど、 基本的には単純な四則演算なのでシェルの機能のみで実装が可能だ。
これで gnu 版の date (1) がインストールされていない環境でも 任意の日付の曜日が簡単に取得できる!。