dateコマンドで覚えておきたい使い方5個

Linux・UNIXで日時を取得する際に良く使用されるdateコマンド。
今回は、このdateコマンドで覚えておくと便利な使い方についてをまとめてみる事にする。

1.基本的な使い方

説明不要と思われるが、基本的には以下のようにコマンドを実行することで、現在のシステム時間を取得する事が出来る。

date

[root@test-centos7 ~]# date
2015年  9月 29日 火曜日 05:59:42 JST

2.出力フォーマットを指定する

dateコマンドでは、「+」以降に以下のようなフォーマットを組み合わせて指定することで、出力される時刻のフォーマットを指定することが出来る。

フォーマット 内容
%Y 西暦4桁(1970~)
%y 西暦2桁
%C 世紀
%m 月(01~12)
%b ロケール表示での月の省略名 (例: Jan)
%B ロケール表示での月の完全名 (例: January)
%d
%e スペースで字幅調整された月の中の何日目かを表す値。%_d と同様
%H 時刻(24H)
%k スペース詰めの時 ( 0..23)。 %_H と同様
%I 時刻(AM/PM)
%l スペース詰めの時 ( 1..12)。 %_I と同様
%p AM/PM表記(大文字)
%P AM/PM表記(小文字)
%m
%s
%N ナノ秒
%a ロケール表示による曜日の省略名 (例: Sun、日)
%A ロケール表示での曜日の完全名 (例: Sunday、日曜日)
%z +hhmm 形式でのタイムゾーン (例: -0400)
%:z +hh:mm 形式でのタイムゾーン (例: -04:00)
%::z +hh:mm:ss 形式でのタイムゾーン (例: -04:00:00)
%:::z 必要な精度に応じて : が使用されるタイムゾーン表示 (例: -04, +05:30)
%Z 英字でのタイムゾーン省略形 (例: EDT)
%j 年の開始日からの日数 (001..366)
%s 1970-01-01 00:00:00 UTC からの秒数
%u 週の何日目かを表す値 (1..7); 1 が月曜日
%w 週の何日目かを表す値 (0..6); 0 を日曜日とする
%W 月曜日を週初めとした週番号 (00..53)
%U 日曜日を週初めとした週番号 (00..53)
%V ISO 週番号。月曜日を週初めとする (01..53)
%g ISO 週番号の最後の2桁 (%G 参照)
%G ISO 週番号の年部分 (%V 参照)。通常は %V と同時に使用される
%n 改行
%t 水平タブ
[root@test-centos7 ~]# # 例)YYYYMMDD_HHMMSSを表示させる
[root@test-centos7 ~]# date +%Y%m%d_%H%M%S
20150930_112417

上記フォーマットのように一つ一つを設定する他、最初からある程度まとまったフォーマットを指定する事も出来る。

フォーマット 内容
%c ロケール表示での日付と時刻 (例: Thu Mar  3 23:05:25 2005)
%D 日付。 %m/%d/%y と同様
%F 完全形式の日付。 %Y-%m-%d と同様
%x ロケール表示での日付 (例: 12/31/99)
%r ロケール12時間表示での時刻 (例 11:11:04 PM)
%R 24時間表示での時および分。%H:%M と同様
%T 時刻。%H:%M:%S と同様
%X ロケール表示での時刻 (例: 23:13:48)
%j 年の開始日からの日数 (001..366)
%s 1970-01-01 00:00:00 UTC からの秒数

このフォーマット指定を利用して当日作業用ディレクトリの作成や一時ファイル名に使用する等、色々な使い方がある。

3.○時間後、○日前といった日時を取得する

GNU拡張されたdateコマンドの場合、「-d」オプションを使用することで○時間前後、○日前後といった指定する時刻を取得する事が出来る。
かなり柔軟な指定の仕方が出来るので、ここではその一部の例だけを紹介する。

一日前、後の日付を求める

[root@test-centos7 ~]# # 現在の日時
[root@test-centos7 ~]# date
2015年  9月 30日 水曜日 11:50:48 JST
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 一日前の日時
[root@test-centos7 ~]# date -d '-1day'
2015年  9月 29日 火曜日 11:50:55 JST
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 一日後の日時
[root@test-centos7 ~]# date -d '1day'
2015年 10月  1日 木曜日 11:51:06 JST

一時間前、一ヶ月後、2年後の日時を求める

[root@test-centos7 ~]# # 現在の日時
[root@test-centos7 ~]# date
2015年  9月 30日 水曜日 11:55:26 JST
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 一時間前の日時
[root@test-centos7 ~]# date -d '-1hour'
2015年  9月 30日 水曜日 10:55:38 JST
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 一ヶ月後の日時
[root@test-centos7 ~]# date -d '1month'
2015年 10月 30日 金曜日 11:55:53 JST
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 2年後の日時
[root@test-centos7 ~]# date -d '1year'
2016年  9月 30日 金曜日 11:57:24 JST

来月の月初、3ヶ月先の月末日付を求める

[root@test-centos7 ~]# # 現在の日時
[root@test-centos7 ~]# date +%Y/%m/01
2015/09/01
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 来月の月初
[root@test-centos7 ~]# date +%Y/%m/01 -d '+1 month'
2015/10/01
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 3ヶ月後の月末
[root@test-centos7 ~]# date +%Y/%m/%d -d "-1day `date +%Y%m01 -d '+4 month'`"
2015/12/31

指定した日付から計算させる

[root@BS-PUB-CENT7-01 ~]# date -d '2000/01/01 10 year'
2010年  1月  1日 金曜日 00:00:00 JST
[root@BS-PUB-CENT7-01 ~]# date -d '2000/01/01 00:00:00 10 min'
2000年  1月  1日 土曜日 00:10:00 JST
[root@BS-PUB-CENT7-01 ~]# date -d '2000/01/01 00:00:00 10 min ago'
1999年 12月 31日 金曜日 23:50:00 JST

4.ファイルの編集日時を取得する

こちらもGNU拡張されたコマンドである必要があるが、「-r」オプションを使用することでファイルの最終更新日を取得することが出来る。

[root@test-centos7 ~]# ls -la /work/test*
-rw-r--r--. 1 root root   36814848  6月 20 19:37 /work/test.image
-rw-r--r--. 1 root root   36814848  7月 26 11:28 /work/test.image.bk
-rw-r--r--. 1 root root        237  9月  6 15:44 /work/test.log
-rw-r--r--. 1 root root        108  7月  7 20:09 /work/test.txt
-rw-r--r--. 1 root root        108  7月 26 11:28 /work/test.txt.bk
-rw-r--r--. 1 root root 1024000000  7月 11 05:12 /work/test1
-rw-r--r--. 1 root root 1024000000  7月 26 11:29 /work/test1.bk
-rw-r--r--. 1 root root         33  9月 11 07:00 /work/test123
-rw-r--r--. 1 root root 1024000000  7月 11 05:13 /work/test2
-rw-r--r--. 1 root root 1024000000  7月 26 11:29 /work/test2.bk
-rw-r--r--. 1 root root        297  9月  6 16:07 /work/test2.log
-rw-r--r--. 1 root root        230  6月  4 07:17 /work/test2.txt
-rw-r--r--. 1 root root        230  7月 26 11:28 /work/test2.txt.bk
-rw-r--r--. 1 root root        298  9月  6 16:21 /work/test3.log
-rw-r--r--. 1 root root        142  9月  8 06:30 /work/test4.sh
-rw-r--r--. 1 root root        102  9月 23 07:56 /work/test5.txt
-rw-r--r--. 1 root root        215  9月 24 06:00 /work/test5_.txt
-rw-r--r--. 1 root root        102  9月 23 07:57 /work/test5_1.txt
-rw-r--r--. 1 root root         56  9月 23 08:13 /work/test5_2.txt
-rw-r--r--. 1 root root        144  9月 23 12:40 /work/test5_3.txt
-rw-r--r--. 1 root root        102  9月 23 13:25 /work/test5_4.txt
-rw-r--r--. 1 root root         54  9月 23 13:30 /work/test5_5.txt
-rw-r--r--. 1 root root        129  9月 24 06:03 /work/test5_6.txt
-rw-r--r--. 1 root root        102  9月 25 06:07 /work/test5_7.txt
[root@test-centos7 ~]# date -r /work/test.log
2015年  9月  6日 日曜日 15:44:26 JST

5.日時を設定する

「-s」オプションを使用することで、システム日時を変更することが出来る。

[root@test-centos7 ~]# date
2015年  9月 30日 水曜日 14:15:01 JST
[root@test-centos7 ~]# date -s "2015/01/01 11:00:00"
2015年  1月  1日 木曜日 11:00:00 JST
[root@test-centos7 ~]#
[root@test-centos7 ~]# date
2015年  1月  1日 木曜日 11:00:03 JST