PowerShellで[DateTime]::ParseExact利用時にCultureInfoを指定する2013-02-09PowerShellで[DateTime]::ParseExact利用時にCultureInfoを指定するPowerShell前回、[DateTime]::ParseExactメソッドを利用したカスタム日付書式について紹介しました。PowerShellで日付書式にカスタム書式パターンを指定する今回は、CultureInfoを指定してみます。現在のCultureInfoを取得するまずはCultureInfoクラスから確認します。ClassどうやらCurrentCultureプロパティから取得できますね。以下のコードで取得できます。[System.Globalization.CultureInfo]::CurrentCulture現在のThreadで取得しましょう。[System.Threading.Thread]::CurrentThread$currentThread.CurrentCulture取得結果です。(日本)CultureInfoの一覧を取得する何はともあれ、指定できるCultureInfoの一覧が知りたいですね。必要な情報は、CultureInfo.CreateSpecificCultureで取得できそうです。MethodPowerShellでは、このコードでSpecificCulturesのコード一覧を取得できます。[System.Globalization.Cultureinfo]::getcultures([System.Globalization.CultureTypes]::SpecificCultures)取得した一覧です。(米国)ThreadのCultrueInfoを指定するまず、先ほど取得したコードをCultureInfoに指定します。USを指定するならこうです。[System.Globalization.CultureInfo]::CreateSpecificCulture("en-US")あとは、現在のThreadに指定するだけですね。現ThreadのCultureは、CurrentCultureとCurrentUICultureプロパティです。このコードで指定します。$cultureさあ、出力してみましょう。$culture[DateTime]::ParseExact("20121112","yyyyMMdd",[System.Globalization.CultureInfo]::CurrentCulture)[DateTime]::ParseExact("20121112","yyyyMMdd",[System.Globalization.CultureInfo]::InvariantCulture)[DateTime]::ParseExact("20121112","yyyyMMdd",$null)出力結果です。AM勿論日本語(ja-JP)を指定しなおせば、日本語書式になります。$newCulture[DateTime]::ParseExact("20121112","yyyyMMdd",[System.Globalization.CultureInfo]::CurrentCulture)[DateTime]::ParseExact("20121112","yyyyMMdd",[System.Globalization.CultureInfo]::InvariantCulture)[DateTime]::ParseExact("20121112","yyyyMMdd",$null)結果です。0:00:00読み取り文字列のCultrueInfoを指定するこの応用で、読み取りたい書式のCultureInfoが現在のCultrureInfoと異なっていても読み取らせることが可能です。現在がja-JPの時に、MMMにNovが指定されても通常は読めません。HH:mm:ss",$null)当然例外が出ます。FormatExceptionそこで、読み取り時のCultureInfoにen-USを指定すれば読み取り可能です。HH:mm:ss",[System.Globalization.CultureInfo]::CreateSpecificCulture("en-US"))読めましたね。13:59:51読み取り日付書式をパターンとしておくこれまでの知識を利用すると、このようなことが可能になります。Formatsこれを、日本語ロケールのPCで実行しても、CultureInfoが異なるためにエラーが出ますが、en-USを指定することで実行できます。[System.Globalization.CultureInfo]::CreateSpecificCulture("en-US"))読み取れました。18:30:17これの素晴らしい所は、カスタム書式をパターンとして変数に保持して読み取りに一貫性を持たせられることを示唆していることです。カスタム書式は、[datetime]::ParseExact()を利用することが適した場面はたくさん見かけるので活用できるといいかと思います。元々の書式がja-JPのCultureInfoで読めるパターンならCultureInfoの指定は不要です。$null)読み取れますね。18:30:17事前に、CurrentCultureをその国のCultureInfoに変更すると出力も変わります。$null)en-USの書式に変わっていますね。PMまとめこれで、各国の日付書式にも対応させる方法が分かりました。CurrentCultureを変える場面は少なく、.ToString()で書式を変える方が多いかとは思います。読み取り時に柔軟に対応できることを覚えておくと、海外製品のログ分析などで有用になります。活用していただけると嬉しい限りです。読者になるこのブログについて引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。