server-memo.net

dateコマンドで日付や時刻を表示したり設定する方法

   

dateコマンド使用方法

「date」コマンドを使用して日付や時刻を設定する方法や表示する方法をまとめています。

いつもdateコマンドを使用するたびに使い方を忘れちゃっているので、自分用のメモでもあります。

日付・時刻の設定

設定方法が2種類あるのでそれぞれについて説明していきます。

MMDDhhmm形式で設定

MMDDhhmm[[CC]YY][.ss]形式で日時を指定する場合は、下記の書式にて設定を行います。

date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

各形式は下記のように日時に対応しています。

  • MM 月
  • DD 日
  • hh 時
  • mm 分
  • CC 年の最初2文字(省略可能)
  • YY 年の最後2文字(省略可能)
  • ss 秒(省略可能)

UTCを設定する場合は「-u|--utc|--universal」オプションを使用します。(どれか一つを選択)

設定例

2017年5月30日18:00に設定しました。

# date 053018002017
2017年  5月 30日 火曜日 18:00:00 JST

※年を指定する場合の順番に注意が必要です。

-sまたは--set オプションを使用して設定

「-s|--set」オプションを使用すると、一般的な日時・時刻表記を使用して設定を行うことが出来ます。

date [-s|--set] 年月日時刻
設定例

何種類かの表記方法で日時を設定した際の結果です。

# date --set "2017-05-30 18:00:00"
2017年  5月 30日 火曜日 18:00:00 JST

# date --set "2017/05/30 18:00:00"
2017年  5月 30日 火曜日 18:00:00 JST

# date --set "05/30 18:00:00 2017"
2017年  5月 30日 火曜日 18:00:00 JST

時刻を指定せずに日時を設定した場合、時刻が00:00:00に設定されてしまうので注意してください。

# date --set "2017-05-30"
2017年  5月 30日 火曜日 00:00:00 JST

日付・時刻の表示

「date」コマンドはオプションや出力フォーマットを指定することで、色々な形式で日付や時刻を表示することが出来ます。

date オプション +フォーマット

オプション一覧

オプション 内容
-d
--date
--date=文字
指定した内容の日時を表示する
-f
--file=ファイル
-dオプションで指定する内容が記述されたファイルを指定
-I[TIMESPEC]
--iso-8601[=TIMESPEC]
iso-8601形式で表示
TIMESPECで'date' 'hours' 'minutes' 'seconds' 'ns'を指定し表示内容を決定する
-r ファイル名
--reference=ファイル名
指定したファイルの最終更新日時を表示
-R
--rfc-2882
RFC 2822フォーマットで表示
表示例 $ date -R
Thu, 01 Jun 2017 01:23:09 +0900
-s
--set=文字
指定した内容で設定する
-u
--utc
--universal
UTCで表示・設定する
--help 使用方法を表示
--version バージョンを表示

フォーマット一覧

時刻や年月日を表示させる際に使用するフォーマットの一覧を、表示させる項目ごとにまとめてみました。

 

 

項目 フォーマット 表示内容 表示例
%Y 4桁の西暦 2017
%y 下2桁の西暦 (00-99) 17
%g ISO 週番号の最後の2桁 (%G 参照) 17
%G ISO 週番号の年部分 (%V 参照)
通常は %V と同時に使用される
2017
%m 月 (01..12) 01
%b ロケール表示での月の省略名 Jan 1月
%B ロケール表示での月の完全名 January 1月
%h %bと同じ Jan 1月
%d 月の中の何日目かを表す値 01 - 31
%e 月の中の何日目かを表す値
(ゼロ埋めなし)
1 - 31
%j 年の開始日からの日数 001 - 366
%H 24時間表記 00 - 23
%k 24時間表記
(ゼロ埋めなし)
 

0 - 24
%I 12時間表記 01 - 12
%l 12時間表記
(ゼロ埋めなし)
1 - 12
%M 0 - 59
%S 00 - 60 
※60は閏秒
%N ナノ秒 000000000 - 999999999
%s 1970年01月01日 00時00分00秒(UTC) から経過した秒数 1496026270
曜日 %a ロケール表示による曜日の省略名 Sun
%A ロケール表示での曜日の完全名 Sunday
日曜日
%u 週の何日目かを表す値 1 - 7
(1が月曜日)
%w 週の何日目かを表す値 0 - 6
(0が日曜日)
週番号 %W 月曜日を週初めとした週番号 00 - 53
%U 日曜日を週初めとした週番号 00 - 53
%V ISO 8601週番号
(月曜日を週初めとする)
01 - 53
午前・午後 %p AM PM のロケールで表示
(不明な場合は空白)
AM PM
午前 午後
%P AM PM のロケールで表示(小文字) am pm
午前 午後
タイムゾーン %Z 英字でのタイムゾーン省略形 JST
%z +hhmm 形式のタイムゾーンを表示 +0900
%:z +hh:mm 形式のタイムゾーンを表示 +09:00
%::z +hh:mm:ss 形式のタイムゾーンを表示 +09:00:00
%:::z 必要な精度に応じて : が使用されるタイムゾーンを表示 +09 +05:30
日付や時刻 %c ロケール表示での日付と時刻 Mon May 29 10:50:42 2017
2017年05月29日 10時50分21秒
%D 日付 %m/%d/%y と同様 05/29/17
%F 完全形式の日付 %Y-%m-%d と同様 2017-05-29
%x ロケール表示での日付 05/29/17
2017年05月29日
時刻 %r ロケール12時間表示での時刻 10:57:10 AM
午前10時57分06秒
%R 24時間表示での時と分 %H:%M と同様 10:58
%T 時刻 %H:%M:%S と同様 11:00:05
%X ロケール表示での時刻 11:01:04
11時01分08秒
世紀 %C 世紀 20
文字の出力 %n 改行 改行します
%t 水平タブ タブを挿入します
%% %を出力 %

表示例

任意の文字を出力

表示を(")ダブルクォーテーションで囲むことで任意の文字を表示させることが出来ます。

日付の前に「DATE」時刻の前に「TIME」と表示させてみます。

$ date "+DATE %Y-%m-%d TIME %H:%M:%S"
DATE 2017-05-29 TIME 17:00:21
表示を改行させる

「%n」で表示結果を改行させることが出来ます。

$ date "+DATE %Y-%m-%d%nTIME %H:%M:%S"
DATE 2017-05-29
TIME 17:00:23

年月日・時刻の表示方法

普段使いそうな内容の出力方法です。

表示内容 表示形式 コマンド 表示例
年月日 yyyymmdd date +%Y%m%d 20170531
年月日 曜日 yyyymmdd Sun..Sat date "+%Y%m%d %a" 20170531 Wed
時刻(24時間制) HHmmss date +%H%M%S 231607
時刻(12時間制) HHmmss date +%l%M%S 111859

私はファイルのバックアップを行う際によく使っています。

$ cp -p test test_`date +%Y%m%d-%H%M%S`
$ ls
test  test_20170530-160328

-d --dateを使用して未来や過去の日時を指定

-dまたは--dateオプションを使用して、未来や過去の日時を表示させる方法です。

n秒後を表示 date --date='n seconds'
n秒前を表示 date --date='n seconds ago'
n分後を表示 date --date='n minutes'
n分前を表示 date --date='n minutes ago'
n時間後を表示 date --date='n hours'
n時間前を表示 date --date='n hours ago'
n日後を表示 date --date='n days'
n日前を表示 date --date='n days ago'
n週間後を表示 date --date='n weeks'
n週間前を表示 date --date='n weeks ago'
nカ月後を表示 date --date='n months'
nカ月前を表示 date --date='n months ago'
n年後を表示 date --date='n years'
n年前を表示 date --date='n years ago'

形式を指定して表示させることもできます。

$ date --date='1 days'
Thu Jun  1 23:48:21 JST 2017

$ date --date='1 days' "+%Y-%m-%d %H:%M:%S"
2017-06-01 23:49:27

いろいろな使用例

覚えておくと役に立つかもしれない使用方法色々です。

1970年01月01日(UTC)からの経過秒数を変換

1970年01月01日 00時00分00秒(UTC) から経過した秒数を分かりやすい表示に変換する方法です。

date --date='@秒数'

実際に変換してみます。

$ date +%s
1496044598

$ date --date='@1496044598'
Mon May 29 16:56:38 JST 2017

ロケールを指定して表示

「date」コマンドはシステムに設定されているロケールによって、表示内容が英語・日本語といったように設定されているローケールにあわせて表示される場合があります。

ロケールを指定して日時を表示させたい場合は、下記のようにロケールを指定して「date」コマンドを実行します。

# env LANG=ja_JP.UTF-8 date
2017年  5月 31日 水曜日 03:28:45 JST

# env LANG=en_US.UTF-8 date
Wed May 31 03:29:29 JST 2017

月末の確認

次の日が1日であれば月末であると判定

$ date --date "1 day" +%d

シェルスクリプトで判別させるならば、こんな感じになります。

DAY=`date --date "1 day" +%d`

if [ $DAY = "01" ];then
  echo "The end of the month."
else
  echo "Not the end of the month."
fi

 - date