亀の甲羅2

今日もまた朝とく起きて励まなん窓に明るきありあけの月

【powershell】それっぽい日付文字列を日付型に変換してフォーマット指定文字列化する

"2021/5/6" みたいな日付文字列をいったん日付型に変えて、フォーマット指定で再度文字列化する方法。
RedmineにRESTでチケット登録するときに、日付がyyyy-mm-dd 形式なので、それに合わせるようにフォーマット変換する。

目次

本文

1. 日付型に変換 → フォーマット指定文字列化

やり方はいくつかあるみたい

1.1 Get-Date コマンドレットを使う

Get-Dateにそれっぽい文字列を与えると、日付型にしてくれる。Get-Date自体に-Formatオプションがあるので、日付型データになってしまえばフォーマット指定するのは簡単。 サンプルとして”2021/5/6" という日付文字列を使用する。

> $a = "2021/5/6"

> get-date -Format "yyyy-MM-dd" $a
2021-05-06

以下のように、文字列をパイプでget-dateに渡してもOK。

> $a | get-date -Format "yyyy-MM-dd"
2021-05-06

フォーマット指定の方法は汎用的な -f オプションでもOK。

> "{0:yyyy-MM-dd}" -f (get-date $a)
2021-05-06

1.2 String型にはToDateTimeメソッドがあるけど?

文字列型のメソッドにToDateTimeがあるけど、これの使い方が良くわからなかったので調べた。
ToDateTimeは引数が必要なメソッドらしいのだが、何を指定すればよいかわかりにくい。
以下の方の記事で勉強になった。

PowerShellで日付書式にカスタム書式パターンを指定する - tech.guitarrapc.cóm

[System.Globalization.CultureInfo]::InvariantCulture という訳の分からないものを与えるだのだそうだ。

> $a = "2021/5/6"

> $a.ToDateTime([System.Globalization.CultureInfo]::InvariantCulture)

2021年5月6日 0:00:00 ・・・日付型になった!

> "{0:yyyy-MM-dd}" -f $a.ToDateTime([System.Globalization.CultureInfo]::InvariantCulture)
2021-05-06

1.3 単なるキャストでもOKみたい

人を馬鹿にしているというくらい簡単に日付型のデータが作成できる。

> $a = [DateTime]"2021/5/6"

> "{0:yyyy-MM-dd}" -f $a
2021-05-06

バージョン情報

> $PSVersionTable

Name                           Value                                                                                                          
----                           -----                                                                                                          
PSVersion                      5.1.19041.1023