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
コメント