はじめに
むしろ date +%s
に移植性がなかったの?と驚く人のほうが多いのではないかと思いますが、現在の POSIX Issue 7 では、date
コマンドの書式で +%s
(UNIXTIME) は対応していません。それが改定され POSIX Issue 8 では対応するようになります。
date +%s
が使えない環境
%s
が使える(または使えない)環境は以下のとおりです。使えない環境に取り消し線を付けています。
- Debian 2.2r7 (2000-08) GNU 版
- FreeBSD 1.0 (1993-11)
- Solaris
- Solaris 10 (2005-01) ※ 2024 年 1 月サポート終了
-
歴史的実装版/usr/bin/date
-
POSIX 準拠版/usr/xpg4/bin/date
-
- Solaris 11 (2011-11)
-
/usr/bin/date
歴史的実装版 -
/usr/xpg4/bin/date
POSIX 準拠版
-
- Solaris 10 (2005-01) ※ 2024 年 1 月サポート終了
- AIX 5.3 (2004-08)
- HP-UX
-
HP-UX 11.22(2002-06-02) - HP-UX 11.23 (2003-10-01)
-
こうやって見ると使えなかったのは Solaris と HP-UX ぐらいで、現在もサポートが続いている OS は Solaris 10 ぐらいしかなく %s
が使えない環境はほとんどないといって良さそうです。
参考
POSIX Issue 8 でどのように変わったのか?
経緯はこちら
現在の POSIX date では date
コマンドで使える書式がずらずらと書かれているのですが Issue 8 ではそれらがばっさり削られて strftime()
を参照するように変わっています。現在の Issue 7 strftime() には %s
はありませんが Issue 8 では追加されます。
さいごに
date +%s
に移植性がないのは、あくまで POSIX Issue 7 の話です。現実にはどの環境でも使えると考えてよく、移植性があります。単に POSIX が更新されていないというだけの話です。どうしても date +%s
に対応していない環境でも動かさなければいけないというのであれば話は別ですが、現在の環境で使えるのであれば date +%s
を使って構いません。もしどうしても POSIX Issue 7 に準拠したいんだよという方は「シェルスクリプトでUNIX時間⇔日付の相互変換を行う関数(POSIX準拠)」を参照してください。