カテゴリー
【Linuxコマンド入門】dateコマンドを徹底解説!システム・ハードウェアクロックから活用事例まで
※ 当ページには【広告/PR】を含む場合があります。
2020/12/28
2025/07/18

目次
- 1. dateコマンドの基本をマスターする
- 2. Alpine Linux (BusyBox) のdateコマンドの注意点
- 3. Linuxにおけるシステムクロックとハードウェアクロックの違い
- 3-1. ハードウェアクロックの時間の変更方法
- 3-1-1. `hwclock`でハードウェアクロックを変更する
- ハードウェアクロックを表示
- システムクロックをハードウェアクロックに同期
- ハードウェアクロックをシステムクロックに同期
- 3-1-2. `timedatectl`でハードウェアクロックを変更する
- 現在の状態を表示
- 日付と時刻を設定
- タイムゾーンを設定
- NTP同期を有効/無効にする
- 3-1-1. `hwclock`でハードウェアクロックを変更する
- 3-1. ハードウェアクロックの時間の変更方法
- 4. dateコマンド活用事例
- 5. まとめ
Linuxシステムで日付と時刻を扱うことは、システム管理からスクリプト作成まで多岐にわたる場面で重要になります。 その中心となるのが
date
しかし、Linuxディストリビューションによっては
date
date
この記事では、
date
date
dateコマンドの基本をマスターする
date
$ date
Thu Jul 17 10:30:00 JST 2025
特定のフォーマットで日時を表示する
+
%Y | ||
%m | ||
%d | ||
%H | ||
%M | ||
%S | ||
%s | ||
%F | ||
%T | ||
%A | ||
%a | ||
%B | ||
%b | ||
%j | ||
%Z | ||
%z |
$ date "+%Y年%m月%d日 %H時%M分%S秒"
2025年07月17日 10時30分00秒
エポック秒 (UNIX時間) との変換
エポック秒(UNIX時間)は、1970年1月1日00:00:00 UTCからの経過秒数を表す数値です。 時間の比較や計算を行う際に非常に便利です。
エポック秒を取得する
%s
$ date +%s
1721218200
エポック秒から日付に変換する
@
-d
--date
date
$ date -d @1721218200
Thu Jul 17 10:30:00 JST 2025
特定の日付や時刻を指定して表示する
-d
--date
date
$ date -d "2024-01-01 12:30:00"
Mon Jan 1 12:30:00 JST 2024
相対的な日付も指定可能です。
$ date -d "yesterday"
$ date -d "tomorrow"
$ date -d "next Monday"
$ date -d "1 week ago"
$ date -d "2 days next week"
$ date -d "last Friday"
Alpine Linux (BusyBox) のdateコマンドの注意点
Alpine Linuxなどで採用されているBusyBox版
date
-d
日付文字列のフォーマット制限
BusyBox版
date
-d
"YYYY/MM/DD hh:mm:ss"
$ date -d "2019/07/01 12:00:00"
date: invalid date '2019/07/01 12:00:00'
BusyBox版が認識するフォーマットは、
date --version
$ date --version
BusyBox v1.29.3 (2019-01-24 07:45:07 UTC) multi-call binary.
...
Recognized TIME formats:
hh:mm[:ss]
[YYYY.]MM.DD-hh:mm[:ss]
YYYY-MM-DD hh:mm[:ss]
[[[[[YY]YY]MM]DD]hh]mm[.ss]
'date TIME' form accepts MMDDhhmm[[YY]YY][.ss] instead
例えば、
YYYY-MM-DD
$ date -d "2018-03-13"
Tue Mar 13 00:00:00 UTC 2018
出力形式をカスタマイズするには、GNU版と同様に
+
$ date -d "2018-03-13" "+%Y年%m月%d日"
2018年03月13日
相対的な時刻操作の代替策
GNU
date
-d "1 day ago"
$ date -d "-1day"
date: invalid date '-1day'
このような場合、エポック秒を利用して手動で計算を行う必要があります。
例えば、「1日前の時刻」を計算するには、現在のエポック秒から
1日分の秒数(60秒 * 60分 * 24時間 = 86400秒)
#1日前の時刻
$ date -d "@$(($(date +%s) - 60*60*24))"
Tue Dec 28 07:36:58 UTC 2021 (例)
同様に、「7時間後の時刻」を計算するには、現在のエポック秒に7時間分の秒数を足します。
#7時間後の時刻
$ date -d "@$(($(date +%s) + 60*60*7))"
Wed Dec 29 14:41:45 UTC 2021 (例)
このように、BusyBox環境では少し工夫が必要ですが、エポック秒を介することで同等の操作が可能です。
Linuxにおけるシステムクロックとハードウェアクロックの違い
Linuxシステムには、時間を管理するための2つの主要な時計が存在します。 これらを理解することは、正確な時刻管理のために非常に重要です。
1. **システムクロック (System Clock / Software Clock)**:
* OSが管理するソフトウェア上の時計
* システム起動時にハードウェアクロックから時刻を読み込み、その後は独立して動作
* NTP (Network Time Protocol) などのサービスによって、
インターネット上のタイムサーバーと同期され、常に正確な時刻を保つことが一般的
* `date`コマンドで表示・設定するのは、このシステムクロック
2. **ハードウェアクロック (Hardware Clock / Real Time Clock - RTC)**:
* マザーボード上のCMOSチップに搭載されている物理的な時計
* システムの電源がオフになっても、バッテリーによって時間を保持
* BIOS/UEFI設定画面で確認・変更できる時計
* `hwclock`や`timedatectl`コマンドで操作
通常、システムクロックとハードウェアクロックは同期されていますが、手動で
date
ハードウェアクロックの時間の変更方法
date
hwclock
timedatectl
`hwclock`でハードウェアクロックを変更する
hwclock
ハードウェアクロックを表示
$ sudo hwclock --show
システムクロックをハードウェアクロックに同期
現在設定されているシステムクロックの時刻をハードウェアクロックに書き込みます。
$ sudo hwclock --systohc
ハードウェアクロックをシステムクロックに同期
ハードウェアクロックの時刻をシステムクロックに読み込みます。 これは通常、システム起動時に自動的に行われます。
$ sudo hwclock --hctosys
`timedatectl`でハードウェアクロックを変更する
timedatectl
現在の状態を表示
$ timedatectl status
日付と時刻を設定
このコマンドは、システムクロックとハードウェアクロックの両方を同時に更新します。
$ sudo timedatectl set-time "YYYY-MM-DD HH:MM:SS"
$ sudo timedatectl set-time "2025-07-17 15:00:00"
タイムゾーンを設定
$ sudo timedatectl set-timezone Asia/Tokyo
NTP同期を有効/無効にする
$ sudo timedatectl set-ntp true
$ sudo timedatectl set-ntp false
dateコマンド活用事例
ここでは、
date
dateコマンドとシェル変数による文字列置換
date
例えば、
YYYY/MM/DD
YYYY-MM-DD
date
sed
${parameter//pattern/string}
#!/bin/bash
that_date="2018/03/13"
#スラッシュをハイフンに置換
dt=$(date -d "${that_date//\//-}" "+%Y年%m月%d日")
echo $dt
このスクリプトを実行すると、以下の出力が得られます。
$ chmod +x that_date.sh
$ ./that_date.sh
2018年03月13日
sed
awkコマンドの中でdateを使うテクニック
CSVデータなど、行ごとに日付情報が含まれている場合に、
awk
date
例えば、
1,3.14,2018-03-30,taco
$ echo '1,3.14,2018-03-30,taco' | awk -F"," '
function _parse_epochtime(rawtime) {
# 日付フォーマットをdateで使える形式に変換(例: / を - に置換)
gsub("/", "-", rawtime);
# Awk内部で外部コマンドを呼び出す
cmd="date -u --date=\""rawtime" 00:00:00\" +\"%s\"";
cmd | getline parsed_time
close(cmd) # getlineで呼び出した外部コマンドは明示的に閉じる
return parsed_time;
}
BEGIN{
OFS = ","; # 出力フィールドセパレータをカンマに設定
}
{
epochtime = _parse_epochtime($3); # 3列目の日付をエポック秒に変換
print $1,$2,epochtime,$4 # 変換したエポック秒を出力
}
'
#出力
1,3.14,1522368000,taco
awk
""
getline
close(cmd)
当年の一月一日からの今日までの日数を計算する
「今年が何%終わったのか?」といった情報を知りたい場合、
date
現在のエポック秒から元旦のエポック秒を引いて、1日あたりの秒数(86400秒)で割ることで、経過日数を算出できます。
#経過日数
$ echo $(( ($(date -u +%s) - $(date -u -d "2021-01-01" +%s))/86400 ))
231 (例)
小数計算が必要な場合は、
bc -l
#年消化率
$ echo "($(date -u +%s) - $(date -u -d "2021-01-01" +%s))/86400/365" | bc -l
.64193380272633744855 (例)
この結果から、「2021年の64.2%が過ぎた」といった具体的な割合を把握できます。
まとめ
date
特に、Alpine LinuxのようなBusyBoxベースの環境では、GNU
date
また、システムクロックとハードウェアクロックの違いを理解し、
hwclock
timedatectl
この記事で紹介した基本的な使い方や活用事例、そしてBusyBox環境での注意点を踏まえることで、
date
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー