概要
Linux環境における日常的な運用保守やシェルスクリプト開発において、日時の取り扱いは欠かせない要素です。本記事では、システム日時の確認から任意の書式設定、さらには過去・未来の日付計算やエポック秒の相互変換に至るまで、date コマンドの機能を網羅的に解説します。ログファイルのローテーションや自動バックアップスクリプトにそのまま組み込める実践的なテクニックを体系的に身につけましょう。
日時の基本表示とカスタム出力フォーマット
端末で引数を指定せずに date を実行すると、オペレーティングシステムに設定されている現在の日時情報がデフォルト形式で出力されます。
標準状態では、曜日、月、日、時刻、タイムゾーン、西暦年がスペース区切りで順に出力される仕様となっています。
⚙️ [頻出オプション一覧]
-d, --date=STRING : システムの現在時刻ではなく、引数で渡された日時の文字列を解析して処理結果を返します。-s, --set=STRING : 指定した日付および時刻の値でシステムクロックを再設定します。-u, --utc : ローカルのタイムゾーンを無視し、協定世界時(UTC)ベースで日時を表示します。-r, --reference=FILE : 指定したファイルが最後に更新されたタイムスタンプを取得して表示します。-I, --iso-8601[=FMT] : 国際標準規格であるISO 8601に準拠したフォーマットで出力します。

date の後ろに + 記号を添えてフォーマット指定子を組み合わせることで、YYYY-MM-DD HH:MM:SS のような読みやすい書式に整形できます。%Y(4桁西暦年)、%m(2桁月)、%d(2桁日)、%H(24時間表記の時)、%M(分)、%S(秒)をハイフンやコロンなどの任意のデリミタで繋ぎ合わせることが可能です。
この出力スタイルは、各種ミドルウェアのログ記録やRDBMSの日時カラムに格納する標準フォーマットとして広く採用されています。

ファイル名にスペースや特殊記号を含めたくない場合は、数字とアンダースコア(_)のみで構成する書式が適しています。
余計な空白文字を排除することでシェルスクリプト内でのパス展開ミスを予防でき、バックアップファイルやアーカイブのサフィックスとして極めて安全に取り扱えます。
実行ごとに一意な名称が機械的に決定されるため、同名ファイルによる意図しない上書き事故を確実に防ぎます。

フォーマット記述子 %A および %B を利用すれば、英語のフルネーム表記を含む可読性の高い日付表現を生成可能です。%A は Saturday などの曜日名全体を展開し、%B は October などの完全な月名に変換されるため、自然言語に近いテキストを作成できます。
定期実行される日次レポートのヘッダー部分や、ユーザー向け通知メッセージの見出しなどで親しみやすい表記を行いたい場合に重宝します。

相対日付の計算とタイムゾーンの切り替え
サーバの地域設定に左右されず、一貫した基準時刻を扱いたい場合は -u オプションを付与します。
マルチリージョンで分散配置されたクラウドサーバ群やグローバル規模のアクセスログを集約・突合する際、UTCを統一基準として用いることで時差による混乱を排除できます。

OS全体のタイムゾーン設定に影響を与えず、一時的に特定地域の日時を算出したい場合は、環境変数 TZ をコマンドの先頭に付与して実行します。
たとえば America/New_York を指定すると、現地の標準時やサマータイムが自動的に加味された現在時刻が得られます。
海外拠点のメンテナンス時間帯の確認や、時差を考慮したジョブスケジュール調整を行う際に非常に便利です。

-d オプションに 'yesterday' というキーワードを渡すことで、昨日時点の日付を自動算出し、指定のフォーマットで得られます。
日付が変わった直後の深夜帯に起動し、前日分のアクセスログをまとめて圧縮・退避するバッチ処理などで必須となる記法です。

過去への遡及計算は '7 days ago' のように直感的な自然言語表現で日数を指定できます。
保存期限を過ぎた古いバックアップデータや世代管理ログを抽出し、自動パージするクリーンアップスクリプトの検索条件生成にうってつけです。

過去だけでなく、'next Monday' のようなフレーズを与えることで未来の特定曜日が何日になるかも即座に判別可能です。
毎週決まった曜日に実施する定期メンテナンス告知の自動配信や、次期サイクルを計算するカレンダー連動ジョブの構築に効果を発揮します。

実践:バックアップスクリプトでの動的ファイル名生成
実際の運用を想定し、一時検証用の作業ディレクトリを整えます。mkdir -p /tmp/backup_demo && cd /tmp/backup_demo を実行して専用環境へ移動します。

バックアップ対象となる設定ファイルを模したダミーデータを用意するため、echo 'Application configuration data' > config.ini を実行してファイルを作成します。

シェル変数 BACKUP_TAG に対し、コマンド置換構文($())を使って date '+%Y%m%d_%H%M%S' の実行結果を代入します。
これにより、スクリプト実行時の年月日および時分秒がひとまとまりになった一意の文字列が変数内に保持されます。
動的な識別子をスクリプト実行ごとに生成するこのアプローチは、ファイル名の衝突を防ぐ定石です。

先ほど定義した変数 BACKUP_TAG をアーカイブファイル名に埋め込み、tar -czf "config_backup_${BACKUP_TAG}.tar.gz" config.ini を実行して圧縮アーカイブを生成します。
ファイル名そのものに取得日時が明記されるため、ディレクトリ一覧を見ただけでどの時点の世代データかを即座に判断できます。
定期ジョブで何度繰り返し実行しても既存のアーカイブを上書きせず、履歴として蓄積されます。

作成されたアーカイブの存在を ls -l config_backup_*.tar.gz で確認します。
出力結果から config_backup_20261024_174030.tar.gz のように、処理を実行した正確な時刻情報がファイル名に反映されていることが分かります。
この動的命名パターンは、cronによる定期実行ジョブやデータパイプラインにおける安定運用の土台となります。

UNIXエポック時間の相互変換と処理速度の精密測定
date +%s を呼び出すと、1970年1月1日 00:00:00 UTC(UNIXエポック)からの通算経過秒数が整数値として取得できます。
このエポック秒はタイムゾーンに依存しない絶対的な時刻値であるため、システム間のデータ連携やユニークIDの発行、時系列データのインデックス処理に最適です。

数値として保存されているエポック秒を可読性のある日時に戻すには、-d オプションに @ プレフィックスを付けて @1700000000 のように渡します。@ を先頭に付与することで、date コマンドは引数を通常の日時文字列ではなく秒単位のエポック値として正しく解釈します。
データベースやAPIログに蓄積されたタイムスタンプを人間が読み取れる形式へ復元・分析する現場作業で必須のテクニックです。

スクリプトの処理性能をベンチマーク計測したい場合は、ナノ秒単位をサポートする %N と %s を併用します。
開始時と終了時のタイムスタンプを取得し、シェルの算術演算式($(( )))を用いて差分をミリ秒単位へと換算します。
大規模データの転送バッチや重いアーカイブ処理において、ボトルネックとなっている区間の所要時間をピンポイントで可視化する際に極めて有効です。

本稿では、date コマンドの基礎的な書式制御から、業務スクリプトに組み込める応用パターンまでを詳しく解説しました。
適切なオプションとフォーマット指定子を組み合わせることで、自動化スクリプトの信頼性とメンテナンス性を大幅に向上させることができます。環境や要件に合わせて積極的にご活用ください。