メインコンテンツへスキップ
初級12分で読める

dateコマンドで日付時刻を自在に操作

Linuxのdateコマンドを使って、現在時刻の表示から日付フォーマットの変換、タイムゾーンの操作まで、実践的な使い方を詳しく解説します。

基礎編date時刻日付タイムゾーン基本コマンド

🎯 この記事で学べること

  • 1
    `date`コマンドの基本的な使い方を理解できます
  • 2
    日付フォーマットを自由にカスタマイズできるようになります
  • 3
    相対的な日付指定や日付計算の方法がわかります
  • 4
    エポック時間(Unix時間)の扱い方を習得できます
  • 5
    ログファイル名やバックアップ処理での実践的な活用方法が身につきます

読了時間: 約12

はじめに

みなさん、ログファイルやバックアップファイルに日付を付けたいと思ったことはありませんか?また、異なるタイムゾーンの時刻を確認したいときはどうしていますか?

dateコマンドは、システムの日付と時刻を表示・操作するための基本的なコマンドです。単純に現在時刻を表示するだけでなく、様々なフォーマットでの出力、日付の計算、タイムゾーンの変換など、たくさんの便利な機能があるんですよ!

今回は、dateコマンドの基本から応用まで、実践的な使い方を一緒に学んでいきましょう!

基本的な使い方

現在の日付と時刻を表示

まずは一番基本的な使い方から見ていきましょう。引数なしで実行するだけです!

$ date
Thu Aug  8 14:30:45 JST 2024

デフォルトでは、曜日、月、日、時刻、タイムゾーン、年の順で表示されますね。

よく使うオプション

dateコマンドには便利なオプションがいくつかあります。

# 現在時刻(ローカル)
$ date
Thu Aug  8 14:30:45 JST 2024

# UTC(協定世界時)で表示
$ date -u
Thu Aug  8 05:30:45 UTC 2024

# RFC 2822形式で表示(メールヘッダー等で使用)
$ date -R
Thu, 08 Aug 2024 14:30:45 +0900

# ISO 8601形式で表示
$ date -I
2024-08-08

UTCは世界の標準時です。日本時間(JST)はUTC+9時間なので、覚えておくと便利ですよ!

日付フォーマットのカスタマイズ

書式指定文字

dateコマンドの真の威力は、書式を自由にカスタマイズできることにあります!+に続けて書式指定文字を使いましょう。

# 年-月-日の形式
$ date '+%Y-%m-%d'
2024-08-08

# 時:分:秒の形式
$ date '+%H:%M:%S'
14:30:45

# 日本語を含む形式
$ date '+%Y年%m月%d日 %H時%M分%S秒'
2024年08月08日 14時30分45秒

主な書式指定文字をまとめておきますね:

| 書式 | 説明 | 例 | |------|------|-----| | %Y | 年(4桁) | 2024 | | %y | 年(2桁) | 24 | | %m | 月(01-12) | 08 | | %d | 日(01-31) | 08 | | %H | 時(00-23) | 14 | | %M | 分(00-59) | 30 | | %S | 秒(00-59) | 45 | | %a | 曜日(短縮) | Thu | | %A | 曜日(フル) | Thursday | | %b | 月名(短縮) | Aug | | %B | 月名(フル) | August |

実用的なフォーマット例

実際によく使われるフォーマットを見てみましょう!

# ログファイル名用
$ date '+app_%Y%m%d.log'
app_20240808.log

# タイムスタンプ用
$ date '+%Y-%m-%d %H:%M:%S'
2024-08-08 14:30:45

# バックアップファイル名用
$ date '+backup_%Y%m%d_%H%M%S.tar.gz'
backup_20240808_143045.tar.gz

日付の計算

相対的な日付指定

-dオプションを使うと、相対的な日付を指定できます。これがとても便利なんです!

# 明日
$ date -d tomorrow
Fri Aug  9 14:30:45 JST 2024

# 昨日
$ date -d yesterday
Wed Aug  7 14:30:45 JST 2024

# 1週間後
$ date -d '1 week'
Thu Aug 15 14:30:45 JST 2024

# 3日前
$ date -d '3 days ago'
Mon Aug  5 14:30:45 JST 2024

# 来月の同じ日
$ date -d 'next month'
Sun Sep  8 14:30:45 JST 2024

具体的な日付の指定

特定の日付を指定することもできますよ!

# 2024年1月1日
$ date -d '2024-01-01'
Mon Jan  1 00:00:00 JST 2024

# 2024年12月25日 18:00
$ date -d '2024-12-25 18:00:00'
Wed Dec 25 18:00:00 JST 2024

# 次の月曜日
$ date -d 'next Monday'
Mon Aug 12 00:00:00 JST 2024

エポック時間の操作

Unix時間(エポック秒)の取得

プログラミングではエポック秒(1970年1月1日からの経過秒数)をよく使います。

# 現在のエポック秒
$ date +%s
1723094445

# 特定日時のエポック秒
$ date -d '2024-01-01 00:00:00' +%s
1704034800

エポック秒から日付への変換

逆に、エポック秒から日付に変換することもできます!

# エポック秒 1704067200 を日付に変換
$ date -d @1704067200
Mon Jan  1 09:00:00 JST 2024

# 読みやすい形式で表示
$ date -d @1704067200 '+%Y-%m-%d %H:%M:%S'
2024-01-01 09:00:00

タイムゾーンの操作

異なるタイムゾーンでの表示

環境変数TZを使って、世界各地の時刻を確認できます!

# 東京
$ TZ='Asia/Tokyo' date
Thu Aug  8 14:30:45 JST 2024

# ニューヨーク
$ TZ='America/New_York' date
Thu Aug  8 01:30:45 EDT 2024

# ロンドン
$ TZ='Europe/London' date
Thu Aug  8 06:30:45 BST 2024

# UTC
$ TZ='UTC' date
Thu Aug  8 05:30:45 UTC 2024

実践的な使用例

ログファイル名の生成

日付を含むファイル名を自動生成する方法を見てみましょう!

# 日付付きログファイルの作成
$ touch "app_$(date +%Y%m%d).log"
$ ls -la app_*.log
-rw-r--r-- 1 user user 0 Aug  8 14:30 app_20240808.log

# 時刻も含めたファイル名
$ touch "debug_$(date +%Y%m%d_%H%M%S).log"
$ ls -la debug_*.log
-rw-r--r-- 1 user user 0 Aug  8 14:30 debug_20240808_143045.log

バックアップスクリプトでの活用

バックアップファイルに日付を付ける実例です。

#!/bin/bash
# バックアップスクリプトの例

# 現在の日時を変数に格納
NOW=$(date +%Y%m%d_%H%M%S)

# バックアップファイル名を生成
BACKUP_FILE="backup_${NOW}.tar.gz"

# バックアップを実行
tar czf "/backup/${BACKUP_FILE}" /data/

echo "バックアップ完了: ${BACKUP_FILE}"

ログのタイムスタンプ付け

ログにタイムスタンプを付ける方法もよく使いますね!

# タイムスタンプ付きでログ出力
$ echo "[$(date '+%Y-%m-%d %H:%M:%S')] サーバー起動"
[2024-08-08 14:30:45] サーバー起動

# ログ関数を定義
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# 使用例
$ log "処理を開始します"
[2024-08-08 14:30:45] 処理を開始します

経過時間の計算

処理時間を測定する方法も覚えておくと便利です!

# 開始時刻を記録
START=$(date +%s)

# 何か処理を実行(ここでは3秒スリープ)
sleep 3

# 終了時刻を記録
END=$(date +%s)

# 経過時間を計算
DURATION=$((END - START))
echo "処理時間: ${DURATION}秒"
# 処理時間: 3秒

高度な使用例

定期レポートの生成

月次レポートなどのファイル名を生成する例です。

# 今月のレポート
$ date '+report_%Y_%m.pdf'
report_2024_08.pdf

# 先月のレポート
$ date -d '1 month ago' '+report_%Y_%m.pdf'
report_2024_07.pdf

# 前年同月のレポート
$ date -d '1 year ago' '+report_%Y_%m.pdf'
report_2023_08.pdf

ファイルの古さチェック

ファイルが何日前に作成されたかを確認する方法です。

# 30日以上前のファイルを検索
$ find /var/log -mtime +30 -type f

# 7日以内に変更されたファイルを検索
$ find /home/user -mtime -7 -type f

# 特定の日付以降に変更されたファイルを検索
$ find . -newermt '2024-08-01' -type f

よくある使い方のまとめ

ファイル操作での活用

# 日付付きディレクトリの作成
$ mkdir "archive_$(date +%Y%m%d)"

# タイムスタンプ付きでファイルをコピー
$ cp important.conf "important.conf.$(date +%Y%m%d_%H%M%S)"

# 古いファイルの自動削除(30日以上前)
$ find /tmp -mtime +30 -exec rm {} \;

スクリプトでの活用

#!/bin/bash
# パフォーマンス測定関数
time_it() {
    local start_time=$(date +%s)
    "$@"
    local end_time=$(date +%s)
    local duration=$((end_time - start_time))
    echo "実行時間: ${duration}秒"
}

# 使用例
time_it sleep 2
# 実行時間: 2秒

🎮 理解度チェック

dateコマンドで年-月-日の形式(例:2024-08-08)で表示するための書式は?
1週間前の日付を表示するコマンドは?
現在のエポック秒(Unix時間)を取得するコマンドは?

📝 まとめ

今回はdateコマンドについて学びました!

  • dateコマンドは日付と時刻を表示・操作する基本的なコマンド
  • +に続けて書式指定文字を使うことで、自由にフォーマットをカスタマイズできる
  • -dオプションで相対的な日付や特定の日付を指定できる
  • エポック秒の取得や変換が可能で、プログラミングでも活用できる
  • ログファイル名やバックアップ処理など、実践的な場面で大活躍する

次はtouchコマンドで、ファイルのタイムスタンプを操作する方法を学びましょう!