【Linuxコマンド入門】dateコマンドを徹底解説!システム・ハードウェアクロックから活用事例まで


※ 当ページには【広告/PR】を含む場合があります。
2020/12/28
2025/07/18
蛸壺の技術ブログ| Alpine Linuxのdateコマンドを使う

Linuxシステムで日付と時刻を扱うことは、システム管理からスクリプト作成まで多岐にわたる場面で重要になります。その中心となるのが
dateコマンドです。このコマンドは、現在の時刻を表示するだけでなく、様々なフォーマットでの出力、特定の日付の計算、さらにはシステムクロックの調整まで可能です。

しかし、Linuxディストリビューションによっては
dateコマンドの挙動に違いがあることも。特に軽量なAlpine Linuxなどで採用されているBusyBox版dateコマンドは、GNU版とは異なる作法を要求されることがあります。

この記事では、
dateコマンドの基本的な使い方から、システムクロックとハードウェアクロックの違い、そしてそれぞれの操作方法、さらには実用的な活用事例までを網羅的に解説します。BusyBox環境での注意点にも触れながら、dateコマンドを使いこなすための知識を深めていきましょう。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

dateコマンドの基本をマスターする

dateコマンドは、引数なしで実行すると現在のシステムの日付と時刻をデフォルトのフォーマットで表示します。

            $ date
        
**出力例:**

            Thu Jul 17 10:30:00 JST 2025
        

特定のフォーマットで日時を表示する

+記号の後にフォーマット文字列を指定することで、表示形式を自由にカスタマイズできます。これは、ログのタイムスタンプやファイル名に日時を含めたい場合などに非常に便利です。

フォーマット指定子

説明

例 (2025年7月17日 10:30:00の場合)

`%Y`

西暦 (4桁)

2025

`%m`

月 (2桁、01-12)

07

`%d`

日 (2桁、01-31)

17

`%H`

時 (24時間表記、00-23)

10

`%M`

分 (2桁、00-59)

30

`%S`

秒 (2桁、00-59)

00

`%s`

エポック秒 (UNIX時間)

1721218200

`%F`

完全な日付フォーマット (YYYY-MM-DD)

2025-07-17

`%T`

完全な時刻フォーマット (HH:MM:SS)

10:30:00

`%A`

曜日のフルネーム

Thursday

`%a`

曜日の省略名

Thu

`%B`

月のフルネーム

July

`%b`

月の省略名

Jul

`%j`

年の通算日 (001-366)

198

`%Z`

タイムゾーン名

JST

`%z`

タイムゾーンのオフセット (+HHMM)

+0900

**使用例:**

            $ 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) オプションを使用すると、現在時刻以外の特定の日付や時刻を指定して表示できます。GNU 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オプション)や相対的な時刻操作において、GNU版とは異なる挙動を示すことがあります。

日付文字列のフォーマット制限

BusyBox版
date-dオプションは、受け付けられる日付文字列のフォーマットが限定的です。例えば、GNU版で一般的な"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"のように相対的な時刻を簡単に計算できますが、BusyBox版ではこの機能は直接サポートされていません。

            $ 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コマンドは、systemdが提供する日付と時刻の設定ユーティリティで、システムクロック、ハードウェアクロック、タイムゾーン、NTP同期などを一元的に管理できます。よりモダンなLinuxシステムで推奨される方法です。

現在の状態を表示
            $ 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コマンドを使うこともできますが、bashの${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を使うとパイプ処理が複雑になりがちですが、bashの組み込み機能を使うことで、よりシンプルに記述できます。

awkコマンドの中でdateを使うテクニック

CSVデータなど、行ごとに日付情報が含まれている場合に、
awkコマンド内でdateコマンドを呼び出してエポック秒に変換するテクニックも有効です。

例えば、
1,3.14,2018-03-30,tacoのようなCSVデータから3列目の日付をエポック秒に変換してみましょう。

            $ 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コマンドは、Linuxシステムにおける日付と時刻の操作に不可欠なユーティリティです。現在の時刻表示から、特定のフォーマットでの出力、エポック秒との変換、さらにはシステムクロックとハードウェアクロックの管理まで、その機能は多岐にわたります。

特に、Alpine LinuxのようなBusyBoxベースの環境では、GNU
dateコマンドとは一部のオプションや日付フォーマットの解釈に違いがあるため、注意が必要です。相対的な時刻計算など、GNU版で直接行える操作も、BusyBox版ではエポック秒を介した手動計算が必要になる場合があります。

また、システムクロックとハードウェアクロックの違いを理解し、
hwclocktimedatectlコマンドを適切に使い分けることで、システムの時刻を常に正確に保ち、タイムゾーン関連のトラブルを防ぐことができます。

この記事で紹介した基本的な使い方や活用事例、そしてBusyBox環境での注意点を踏まえることで、
dateコマンドをより効果的に使いこなし、日々のシステム管理やシェルスクリプト作成に役立てていただければ幸いです。
記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。

合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集