【PowerShell】Get-Dateで日付をフォーマットする方法|書式指定子・加算減算・ファイル名付与

【PowerShell】Get-Dateで日付をフォーマットする方法|書式指定子・加算減算・ファイル名付与 PowerShell

PowerShellで日付を扱うときの中心がGet-Dateです。現在の日時を取得し、-Formatで好きな書式の文字列に整えられます。ログのタイムスタンプ、バックアップファイル名、日付の計算など、スクリプトのあらゆる場面で使います。

使い方は簡単ですが、最大の落とし穴は書式指定子の大文字小文字です。月はMM、分はmm。24時間はHH、12時間はhh。これを取り違えると、月のつもりが分になっていた、という気づきにくいバグになります。この記事では、実機で確認しながら、書式・計算・ファイル名付与までを整理します。

先に結論

  • 現在日時はGet-Date、整形はGet-Date -Format "yyyy/MM/dd HH:mm:ss"です。
  • 大文字小文字で意味が変わります。月はMM、分はmm、24時間はHH、12時間はhhです。
  • ファイル名にはyyyyMMdd_HHmmssを使います。:はファイル名に使えないためHH:mm:ssは不可です。
  • 日付の加算・減算は(Get-Date).AddDays(7).AddDays(-1)のように行います。
  • 2つの日付の差は引き算で求められ、TimeSpanとして.Daysなどが取れます。
  • 曜日名(dddd)や月名(MMMM)は、言語設定によって日本語・英語が変わります。

日付はログ出力やファイル名付与で多用します。ログを出力する簡易レポートログファイルをリアルタイム監視する方法、定期実行のスケジュールタスクを自動作成する方法とあわせて使うと効果的です。

スポンサーリンク

現在の日付・時刻を取得する

Get-Dateを実行すると、現在の日時がDateTimeオブジェクトとして得られます。年・月・日などの部分も、プロパティで個別に取り出せます。

get-date-basic.ps1
# 現在の日時(DateTime オブジェクト)
$now = Get-Date

# 各部分をプロパティで取り出す
$now.Year     # 年
$now.Month    # 月
$now.Day      # 日
$now.Hour     # 時
$now.DayOfWeek  # 曜日

# 特定の日付を作る(文字列から)
$date = Get-Date "2026-03-09 14:05:07" 

Get-Date "2026-03-09"のように文字列を渡すと、その日付のオブジェクトを作れます。以降の例では、説明をわかりやすくするため2026-03-09 14:05:07を使います。

-Formatで好きな書式に整形する

日時を文字列に整えるには-Formatに書式指定子を渡します。(Get-Date).ToString("...")でも同じ結果になります。

get-date-format.ps1
Get-Date -Format "yyyy/MM/dd"           # 2026/03/09
Get-Date -Format "yyyy-MM-dd HH:mm:ss"  # 2026-03-09 14:05:07
Get-Date -Format "yyyy年MM月dd日"        # 2026年03月09日

# ToString でも同じ
(Get-Date).ToString("yyyy/MM/dd HH:mm:ss")

実機でも、2026-03-09 14:05:07に対して"yyyy/MM/dd HH:mm:ss"2026/03/09 14:05:07"yyyy年MM月dd日"2026年03月09日になることを確認しています。

書式指定子の一覧

よく使う書式指定子をまとめます。下の例はすべて2026-03-09 14:05:07(月曜日)を整形した結果です。

指定子 意味 出力例
yyyy 年(4桁) 2026
yy 年(2桁) 26
MM 月(2桁) 03
M 月(先頭ゼロなし・単独不可) 3(例 M/d→3/9)
MMMM 月の名前 3月
dd 日(2桁) 09
d 日(先頭ゼロなし・単独不可) 9(例 M/d→3/9)
dddd 曜日の名前 月曜日
HH 時(24時間・2桁) 14
hh 時(12時間・2桁) 02
mm 分(2桁) 05
ss 秒(2桁) 07
tt 午前・午後 午後
1文字だけの指定子は標準書式になる

注意したいのが、ToString("M")ToString("d")のように1文字だけを渡したときです。この場合、PowerShell(.NET)はそれを「月数」「日数」ではなく、あらかじめ定義された標準書式パターンと解釈します。実機ではToString("d")2026/03/09(短い日付)、ToString("M")3月9日になりました。先頭ゼロなしの月・日が欲しいときは、yyyy/M/dのように他の文字と組み合わせるか、%M%dのように%を付けてください(実機でyyyy/M/d2026/3/9を確認)。

【最重要】大文字小文字で意味が変わる

書式指定子は大文字と小文字で別物です。ここがPowerShellの日付で最も間違えやすいポイントです。

case-sensitivity.ps1
$dt = Get-Date "2026-03-09 14:05:07"

# 月と分: MM は月、mm は分
$dt.ToString("MM")   # 03(月)
$dt.ToString("mm")   # 05(分)

# 24時間と12時間: HH は24時間、hh は12時間
$dt.ToString("HH")   # 14(24時間表記)
$dt.ToString("hh")   # 02(12時間表記)

# よくある間違い: "HH:MM" は「時:月」になってしまう
$dt.ToString("HH:MM")   # 14:03 ← 分のつもりが月!
$dt.ToString("HH:mm")   # 14:05 ← 正しい
MMとmm、HHとhhを取り違えない

実機で確認したところ、MM03(月)、mm05(分)になりました。"HH:MM"と書くと「時:」という意味になり、14:03のような一見それらしい値が出るため、間違いに気づきにくいのが厄介です。時刻は必ずHH:mm:ss(時・分・秒)と覚えてください。

よく使う書式パターン

実務で頻出する組み合わせをまとめます。コピーして使えます。

common-patterns.ps1
$dt = Get-Date "2026-03-09 14:05:07"

$dt.ToString("yyyy/MM/dd")            # 2026/03/09(日付)
$dt.ToString("yyyy-MM-dd HH:mm:ss")   # 2026-03-09 14:05:07(日時)
$dt.ToString("yyyyMMdd")              # 20260309(ファイル名向け・日付)
$dt.ToString("yyyyMMdd_HHmmss")       # 20260309_140507(ファイル名向け・日時)
$dt.ToString("yyyy年MM月dd日(ddd)")    # 2026年03月09日(月)(和式)
$dt.ToString("o")                     # 2026-03-09T14:05:07.0000000(ISO 8601)

標準のISO 8601形式は"o"(ラウンドトリップ書式)で出せます。実機では2026-03-09T14:05:07.0000000になりました。他システムとの連携では、このISO形式がやり取りに向いています。

日付を加算・減算する

「7日後」「前日」「翌月」などの計算は、DateTimeAdd系メソッドで行います。マイナスを渡せば過去方向になります。

add-subtract.ps1
$dt = Get-Date "2026-03-09"

$dt.AddDays(7)      # 7日後
$dt.AddDays(-1)     # 前日(昨日)
$dt.AddHours(3)     # 3時間後
$dt.AddMonths(1)    # 翌月
$dt.AddYears(-1)    # 1年前

# 「昨日の日付」をファイル名向けに整形する例
(Get-Date).AddDays(-1).ToString("yyyyMMdd")

実機でも、2026-03-09に対してAddDays(1)03/10AddDays(-1)03/08AddMonths(1)2026/04になりました。月末をまたぐ加算(1月31日 + 1か月など)も、AddMonthsが妥当な日付に丸めてくれます。

2つの日付の差を求める

2つの日付の差は、引き算で求められます。結果はTimeSpanになり、日数・時間・分などを取り出せます。

date-diff.ps1
$start = Get-Date "2026-03-01"
$end   = Get-Date "2026-03-09"

$diff = $end - $start   # TimeSpan が返る

$diff.Days        # 8(差の日数)
$diff.TotalHours  # 192(合計時間)
$diff.TotalDays   # 8(合計日数・小数も含む)

# New-TimeSpan でも同じことができる
New-TimeSpan -Start $start -End $end

実機でも、2026-03-09から2026-03-01を引くとDays8TotalHours192になりました。.Daysは「差のうちの日数部分」、.TotalDaysは「差を日数に換算した合計」で、時間を含む差では値が変わるため使い分けます。

ファイル名にタイムスタンプを付ける(コロン禁止)

バックアップやログでよく使うのが、ファイル名への日時付与です。ここで重要なのは、Windowsのファイル名にコロン:は使えないことです。時刻書式のHH:mm:ssをそのままファイル名に入れると失敗します。

filename-timestamp.ps1
# NG: コロンはファイル名に使えない
$ngName = "backup_" + (Get-Date -Format "yyyy/MM/dd HH:mm:ss") + ".zip"
# backup_2026/03/09 14:05:07.zip ← / も : も使えず失敗

# OK: 区切りを使わない書式にする
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$fileName = "backup_$timestamp.zip"
# backup_20260309_140507.zip

# 部分式 $() を使うと1行で書ける
$path = "C:\backup\log_$(Get-Date -Format 'yyyyMMdd').txt" 

ファイル名向けには、区切り文字を含まないyyyyMMdd_HHmmssが定番です。$()はサブ式(部分式)と呼ばれ、文字列の中で式を評価したいときに使います。中の書式指定にはシングルクォートを使うと、二重引用符との入れ子を避けられます。

曜日・月名は言語設定で変わる

dddd(曜日名)やMMMM(月名)は、実行環境の言語設定(カルチャー)によって表記が変わります。日本語環境では日本語、英語環境では英語になります。

culture-names.ps1
$dt = Get-Date "2026-03-09"

# 日本語環境(ja-JP)での結果
$dt.ToString("dddd")   # 月曜日
$dt.ToString("MMMM")   # 3月
$dt.ToString("tt")     # 午前/午後

# 言語を固定したい場合はカルチャーを指定する
$en = [System.Globalization.CultureInfo]::GetCultureInfo("en-US")
$dt.ToString("dddd", $en)   # Monday
$dt.ToString("MMMM", $en)   # March

実機でも、日本語環境(ja-JP)ではdddd月曜日MMMM3月になりました。環境に依存させたくない場合は、ToStringの第2引数にカルチャーを渡して英語などに固定できます。一方、yyyyMMddのような数値の指定子は、言語設定に関係なく同じ数字になります。

よくある失敗

分のつもりでMMと書いて月になる

時刻はHH:mm:ssです。HH:MMと書くと「時:月」になり、14:03のような紛らわしい値が出ます。月はMM、分はmmと覚えてください。

ファイル名にコロンを含めて保存に失敗する

Windowsのファイル名に:/は使えません。HH:mm:ssをそのまま使わず、yyyyMMdd_HHmmssのように区切りなしの書式にします。

-Formatの結果を日付として計算しようとする

Get-Date -Formatが返すのは文字列です。.AddDays()などの計算はできません。計算するなら整形前のDateTimeに対して行い、最後に整形します。

曜日・月名が想定と違う言語で出る

ddddMMMMは言語設定に従います。固定したいならToStringにカルチャーを渡します。

よくある質問

Q月と分はどう書き分けますか?
A月は大文字のMM、分は小文字のmmです。時刻はHH:mm:ss(24時間の時・分・秒)と覚えると間違えません。12時間表記が必要なときだけhhtt(午前・午後)を使います。
Qファイル名に使える日時の書式は?
AyyyyMMdd_HHmmssが定番です。:/はファイル名に使えないため、区切り文字を含まない形にします。日付だけならyyyyMMddで十分です。
Q昨日や先月の日付を出すには?
A(Get-Date).AddDays(-1)で昨日、(Get-Date).AddMonths(-1)で先月になります。マイナスの値を渡すと過去方向の日付になります。整形は計算のあとに.ToString("yyyyMMdd")などで行います。
Q-Format と ToString はどちらを使うべきですか?
A結果は同じです。コマンドラインで手早く出すならGet-Date -Format、変数に入れたDateTimeを整形するなら.ToString()が自然です。好みや文脈で使い分けてかまいません。
Q曜日を英語で出したいです。
A$dt.ToString("dddd", [System.Globalization.CultureInfo]::GetCultureInfo("en-US"))のように、第2引数にカルチャーを渡すとMondayのように英語で出せます。日本語固定ならja-JPを指定します。

まとめ

  • 現在日時はGet-Date、整形は-Format.ToString()で行います。
  • 大文字小文字に注意:月MM/分mm、24時間HH/12時間hhです。
  • ファイル名には区切りのないyyyyMMdd_HHmmssを使います(:は不可)。
  • 加算・減算はAddDaysなどのメソッド、差は引き算でTimeSpanが得られます。
  • -Formatの結果は文字列なので、計算は整形前のDateTimeで行います。
  • ddddMMMMは言語設定で変わるため、固定したいならカルチャーを指定します。

PowerShellの日付処理は、書式指定子の大文字小文字さえ押さえれば、あとは素直です。時刻はHH:mm:ss、ファイル名はyyyyMMdd_HHmmss、という2つの型を覚えておけば、ログやバックアップのスクリプトをすぐ書けるようになります。