PowerShellでシステムのカレンダー設定(グレゴリオ暦、和暦)を変更する方法

PowerShellでシステムのカレンダー設定(グレゴリオ暦、和暦)を変更する方法という問いには、Get-Cultureで現在値を保存し、ja-JPのOptionalCalendarsから目的の暦を型で選び、CultureInfoをSet-Cultureへ渡してユーザー範囲で変更するという方法で答えます。カレンダーと日付表示はユーザーのカルチャ設定に含まれ、アプリによって反映時期が異なる。システム時刻やタイムゾーンそのものは別設定である。この記事では現在ユーザー、Culture.Name、DateTimeFormat.Calendar、ShortDatePatternを組で保存するを判断軸にし、実行前の確認、記事固有のコード、合否判定、戻し方を一続きで示します。

seq6のタイムゾーン変更ではなく、ユーザーのカレンダー・日付表示の規則を扱う。完了は「新しいセッションでGet-Cultureと日付表示が期待値となり、時刻とタイムゾーンは変化していない」と定義します。対象が取れない場合は「候補カルチャがない場合はOS言語機能と正式なカルチャ名を確認し、表示名から推測しない」として切り分け、推測で成功扱いにしません。

目次

言語・地域とカレンダーを切り分ける

言語・地域とカレンダーを切り分けるでは、Windowsのカレンダー表示形式変更の対象を「現在ユーザー、Culture.Name、DateTimeFormat.Calendar、ShortDatePatternを組で保存する」という単位で扱います。カレンダーと日付表示はユーザーのカルチャ設定に含まれ、アプリによって反映時期が異なる。システム時刻やタイムゾーンそのものは別設定である。対象が複数なら表示名の部分一致で先頭を採らず、一意になる条件を追加します。

Windowsのカレンダー表示形式変更を始める前に、PowerShellの版、コマンドの提供元、必要権限、管理ポリシーの有無を確認します。権限不足と対象なしは意味が異なるため、例外を0件へ置き換えません。

Get-Cultureで現在のCalendarを読む

Get-Cultureで現在のCalendarを読むは変更前の基準点です。現在ユーザー、Culture.Name、DateTimeFormat.Calendar、ShortDatePatternを組で保存するを出力に含め、取得時刻と一緒に保存します。値だけを切り取ると別対象との比較になるため、識別列を省きません。

$beforeCulture = Get-Culture
$beforeTimeZoneId = (Get-TimeZone).Id
$targetCultureName = 'ja-JP'
$targetCalendarKey = 'JapaneseCalendar' # 西暦は例: GregorianCalendar/Localized
$targetCulture = [Globalization.CultureInfo]::new($targetCultureName, $false)
$getCalendarKey = {
  param([Globalization.Calendar]$Calendar)
  if ($Calendar -is [Globalization.GregorianCalendar]) {
    return "GregorianCalendar/$($Calendar.CalendarType)"
  }
  $Calendar.GetType().Name
}
$calendarCandidates = @($targetCulture.OptionalCalendars | Where-Object {
  (& $getCalendarKey $_) -eq $targetCalendarKey
})
if ($calendarCandidates.Count -ne 1) {
  throw "$targetCultureName で $targetCalendarKey を一意に選択できません。"
}
$targetCulture.DateTimeFormat.Calendar = $calendarCandidates[0]
$targetShortDatePattern = if ($targetCalendarKey -eq 'JapaneseCalendar') {
  'gg y/MM/dd'
} else {
  'yyyy/MM/dd'
}
$targetCulture.DateTimeFormat.ShortDatePattern = $targetShortDatePattern
[pscustomobject]@{
  BeforeCulture=$beforeCulture.Name
  BeforeCalendar=$beforeCulture.DateTimeFormat.Calendar.GetType().Name
  TargetCulture=$targetCulture.Name; TargetCalendarKey=$targetCalendarKey
  TargetShortDatePattern=$targetCulture.DateTimeFormat.ShortDatePattern
  TimeZoneId=$beforeTimeZoneId
}

カレンダーと日付表示はユーザーのカルチャ設定に含まれ、アプリによって反映時期が異なる。システム時刻やタイムゾーンそのものは別設定である。出力が多い場合も最初から無理に一件へ絞らず、候補数と除外理由を残してから対象を決めます。

利用可能なカルチャ名を確認

Get-Cultureで現在値を保存し、ja-JPのOptionalCalendarsから目的の暦を型で選び、CultureInfoをSet-Cultureへ渡してユーザー範囲で変更する。Windowsのカレンダー表示形式変更ではこの進め方により、操作したという事実ではなく、期待する状態へ到達したかでタイトルの問いへ答えられます。seq6のタイムゾーン変更ではなく、ユーザーのカレンダー・日付表示の規則を扱う。

利用可能なカルチャ名を確認の合格条件は、新しいセッションでGet-Cultureと日付表示が期待値となり、時刻とタイムゾーンは変化していないことです。作業時刻、実行ユーザー、端末名を添え、判断に使った値が後から追える形にします。

Set-Cultureの影響範囲を理解

Set-Cultureの影響範囲を理解では、Get-Cultureで現在値を保存し、ja-JPのOptionalCalendarsから目的の暦を型で選び、CultureInfoをSet-Cultureへ渡してユーザー範囲で変更する。Windowsのカレンダー表示形式変更の例中にある名前、パス、ID、時刻はサンプルなので、そのまま本番へ貼らず、直前の読み取り結果から承認値を入れます。

$approvalToken = "SET-CULTURE $targetCultureName/$targetCalendarKey"
if ((Read-Host "変更する場合は $approvalToken を入力") -ne $approvalToken) {
  throw 'カルチャ変更は承認されませんでした。'
}
$probePath = $null
try {
Set-Culture -CultureInfo $targetCulture -ErrorAction Stop
# Set-Cultureの反映対象は後続セッションなので、新しいpowershell.exeで読み直す。
$probePath = Join-Path $env:TEMP ("ittrip-culture-{0}.json" -f [guid]::NewGuid())
$probeCommand = @'
$culture = Get-Culture
$calendar = $culture.DateTimeFormat.Calendar
$calendarKey = if ($calendar -is [Globalization.GregorianCalendar]) { "GregorianCalendar/$($calendar.CalendarType)" } else { $calendar.GetType().Name }
[pscustomobject]@{ Name=$culture.Name; Calendar=$calendar.GetType().Name; CalendarKey=$calendarKey; ShortDatePattern=$culture.DateTimeFormat.ShortDatePattern } | ConvertTo-Json -Compress | Set-Content -LiteralPath '@@PROBE@@' -Encoding UTF8
'@
$probeCommand = $probeCommand.Replace('@@PROBE@@', $probePath.Replace("'","''"))
$encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($probeCommand))
$process = Start-Process powershell.exe -ArgumentList @('-NoProfile','-EncodedCommand',$encoded) -Wait -PassThru
if ($process.ExitCode -ne 0 -or -not (Test-Path -LiteralPath $probePath)) {
  throw '新しいセッションでカルチャを検証できません。'
}
$observed = Get-Content -LiteralPath $probePath -Raw -Encoding UTF8 | ConvertFrom-Json
$timeZoneUnchanged = (Get-TimeZone).Id -eq $beforeTimeZoneId
$exact = $observed.Name -eq $targetCultureName -and
  $observed.CalendarKey -eq $targetCalendarKey -and
  $observed.ShortDatePattern -eq $targetShortDatePattern -and $timeZoneUnchanged
if (-not $exact) { throw '後続セッションの暦・日付形式・タイムゾーンが期待値と一致しません。' }
} catch {
  Set-Culture -CultureInfo $beforeCulture -ErrorAction Stop
  throw
} finally {
  if ($probePath -and (Test-Path -LiteralPath $probePath)) {
    Remove-Item -LiteralPath $probePath -ErrorAction SilentlyContinue
  }
}

日付を文字列で保存する既存スクリプトやCSVの解釈が変わる可能性がある。業務アプリの事前試験を行う。Windowsのカレンダー表示形式変更でプレビュー対応コマンドを使える場合はWhatIfを先に実行し、非対応の操作は対象一覧と引数を画面へ出して人が承認してから一度だけ実行します。

日付文字列でなくDateTimeを検証

日付文字列でなくDateTimeを検証では同じ対象を別経路でもう一度読みます。判定したいのは「コマンドが終了したか」ではなく、新しいセッションでGet-Cultureと日付表示が期待値となり、時刻とタイムゾーンは変化していないかどうかです。

[pscustomobject]@{
  Culture=$observed.Name; Calendar=$observed.Calendar; CalendarKey=$observed.CalendarKey
  ShortDatePattern=$observed.ShortDatePattern
  TimeZoneId=(Get-TimeZone).Id; ExactMatch=$true
}

候補カルチャがない場合はOS言語機能と正式なカルチャ名を確認し、表示名から推測しない。Windowsのカレンダー表示形式変更の期待値と実測値が一致しないときは追加変更を重ねず、対象識別、権限、ポリシー、時間差の順で原因を分けます。

サインアウト後に反映する項目

日付を文字列で保存する既存スクリプトやCSVの解釈が変わる可能性がある。業務アプリの事前試験を行う。サインアウト後に反映する項目に該当したら、警告を消して継続するのではなく、どの条件で止まったかを記録します。

候補カルチャがない場合はOS言語機能と正式なカルチャ名を確認し、表示名から推測しない。Windowsのカレンダー表示形式変更ではエラー本文、FullyQualifiedErrorId、対象ID、直前に成功した段階を残すと、別担当者が安全な地点から調査できます。

旧カルチャ名へ戻せるよう保存

交換データはISO 8601など文化非依存形式を使い、画面表示だけをローカライズする。Windowsのカレンダー表示形式変更を繰り返す場合は、正常、対象なし、要承認、失敗を異なる終了状態として記録し、前回値との比較だけで異常を決めません。

旧カルチャ名へ戻せるよう保存の識別軸現在ユーザー、Culture.Name、DateTimeFormat.Calendar、ShortDatePatternを組で保存する
採用する実測新しいセッションでGet-Cultureと日付表示が期待値となり、時刻とタイムゾーンは変化していない
0件時の扱い候補カルチャがない場合はOS言語機能と正式なカルチャ名を確認し、表示名から推測しない
保留にする兆候日付を文字列で保存する既存スクリプトやCSVの解釈が変わる可能性がある。業務アプリの事前試験を行う

Windowsのカレンダー表示形式変更の実行記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外した候補と理由を同じ作業番号で残します。特に「現在ユーザー、Culture.Name、DateTimeFormat.Calendar、ShortDatePatternを組で保存する」を省くと、後日の再確認で別対象の値を比較するおそれがあります。画面コピーだけでなく、日時と端末名を含む構造化した出力も保存します。

PowerShellでシステムのカレンダー設定(グレゴリオ暦、和暦)を変更する方法を定期手順へ組み込む場合も、初回は対話的に候補を確認します。正常時は「新しいセッションでGet-Cultureと日付表示が期待値となり、時刻とタイムゾーンは変化していない」、判定不能時は「候補カルチャがない場合はOS言語機能と正式なカルチャ名を確認し、表示名から推測しない」、中止時は「日付を文字列で保存する既存スクリプトやCSVの解釈が変わる可能性がある。業務アプリの事前試験を行う」をそれぞれ別の結果として扱います。これにより、0件や例外を都合よく成功へ丸めず、次の担当者が同じ対象と条件で追試できます。

修正後コードの合格条件:変更対象は現在ユーザーのCultureInfoです。JapaneseCalendarは型名、複数あるGregorianCalendarはCalendarTypeを加えたkeyで一件に絞ります。日時やタイムゾーンを変えずSet-Cultureへ渡し、後続セッションで暦keyとShortDatePatternが一致しなければ旧Cultureへ戻します。

公式情報・参考資料

Windowsのカレンダー表示形式変更で使うコマンド名、引数、対応環境は次のMicrosoft一次資料で確認しました。記事の確認日は2026年7月17日です。OSやモジュール更新後は、実行端末のGet-Helpと併せて再確認してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次