PowerShellでDateTimeをフォーマットする方法


156

次のGet-Dateように問題なくコマンドレットをフォーマットできます。

$date = Get-Date -format "yyyyMMdd"

しかし、変数に日付を取得したら、それをどのようにフォーマットしますか?以下のステートメント

$dateStr = $date -format "yyyMMdd"

このエラーを返します:

「 '-f'演算子の右側に値式を指定する必要があります」


3
私は実際にこの構文が機能することを望みました。$date -format "yyyMMdd"は、単一のオブジェクトをフォーマットする場合よりもはるかに直感的です'{0:yyyyMMdd}' -f $date
orad 2015

余談ですが、PowerShellには-f演算子(受け入れられた回答に示されている構文の)があり-formatますが、演算子はありません。エラーメッセージが文句を言っているormat:有効RHSオペランドが、最近のPowerShellのバージョンは実際には異なる、より有用なエラーメッセージ発することに注意されていないUnexpected token '-format' in expression or statement
mklement0を

回答:


221

.NETの場合と同じです。

$DateStr = $Date.ToString("yyyyMMdd")

または:

$DateStr = '{0:yyyyMMdd}' -f $Date

26

質問には回答しましたが、不足している情報がいくつかあります。

変数とコマンドレット

$Date変数に値があり、-f演算子は次の形式で機能します'format string' -f values。呼び出すGet-Date -format "yyyyMMdd"場合は、いくつかのパラメーターを指定してコマンドレットを呼び出します。値 "yyyyMMdd"は、パラメーターFormat(try help Get-Date -param Format)の値です。

-f オペレーター

書式文字列はたくさんあります。少なくともpart1part2を見てください。彼女が使うstring.Format('format string', values')。演算子はメソッドと非常によく似ている'format-string' -f valuesため、それはと考えてください(いくつかの違いはあります(詳細については、スタックオーバーフローの質問をご覧ください:PowerShellの-f演算子のRHSはどのように正確に機能しますか?)。-fstring.Format


3
彼が言っていることは、-Formatパラメーターにより、Get-DateTimeがDateTimeオブジェクトではなく文字列を返すことです。そのため、変数$ Dateは期待どおりにフォーマットできなくなります。-Formatパラメータが特定のDateTimeオブジェクトのToStringメソッドのデフォルトの動作を変更することを本当に望みます。その後、期待どおりに機能します。
Nathan Hartley


18

非常に便利ですが、おそらくあまり効率的ではありませんが、解決策はメンバー関数を使用することですGetDateTimeFormats()

$d = Get-Date
$d.GetDateTimeFormats()

これにより、日付値のフォーマットスタイルの大きな文字列配列が出力されます。次に、- []演算子を使用して配列の要素の1つを選択できます。たとえば、

PS C:\> $d.GetDateTimeFormats()[12]
Dienstag, 29. November 2016 19.14


7

-Formatオプションを絶対に使用する必要がある場合は、次のようにします。

$dateStr = Get-Date $date -Format "yyyMMdd"

しかしながら

$dateStr = $date.toString('yyyMMdd')

おそらくもっと効率的です.. :)


$dateStr = (Get-Date $date -Format "yyyMMdd")結果として、datetimeオブジェクトとは異なるオブジェクトタイプになります。これをいじってみてください$dateStr = [datetime](Get-Date $date -Format "yyyMMdd") 。すぐに違いがわかります。
ジェイミーマーシャル

1
ええ、そうです。それは文字列です。それが、私がそれにdateStr。という名前を付けた理由です。:) OPは、日付オブジェクトを文字列にフォーマットしようとしました。
tplive

4

これをcmd.exe(バッチファイルで)使用するためにここに来た場合:

powershell -Command (Get-Date).ToString('yyyy-MM-dd')

4

時間とフォーマットのわずかなバリエーションが必要でした。これは私の目的に最適です:

$((get-date).ToLocalTime()).ToString("yyyy-MM-dd HHmmss")

2019-08-16 215757

コメントの@ mklement0によると、これは同じ結果をもたらすはずです:

(get-date).ToString("yyyy-MM-dd HHmmss")

3

非常に有益@stejからの回答ここでは、しかし、短い答えは:の中で他のオプション、あなたが持っている3つの簡単なオプションのフォーマットへの[可能System.DateTime]変数に保存されています:

  1. 変数をGet-Dateコマンドレットに渡します。 Get-Date -Format "HH:mm" $date

  2. toString()メソッドを使用します。 $date.ToString("HH:mm")

  3. 複合フォーマットを使用: "{0:HH:mm}" -f $date


3

現在の日付をHTTPヘッダーで使用するためにフォーマットしようとする人は、「r」フォーマット(RFC1123の短縮形)を使用しますが、警告に注意してください...

PS C:\Users\Me> (get-date).toString("r")
Thu, 16 May 2019 09:20:13 GMT
PS C:\Users\Me> get-date -format r
Thu, 16 May 2019 09:21:01 GMT
PS C:\Users\Me> (get-date).ToUniversalTime().toString("r")
Thu, 16 May 2019 16:21:37 GMT

つまり「ToUniversalTime()」を使用することを忘れないでください


これを「xml」スタイルの日時に「o」とともに使用する
JohnOpincar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.