So formatieren Sie eine DateTime in PowerShell

155

Ich kann das Get-DateCmdlet problemlos so formatieren:

$date = Get-Date -format "yyyyMMdd"

Aber wie formatiere ich ein Datum in einer Variablen? Die Aussage unten

$dateStr = $date -format "yyyMMdd"

gibt diesen Fehler zurück:

"Sie müssen einen Wertausdruck auf der rechten Seite des Operators '-f' angeben."

Ev.
quelle
3
Ich wünschte tatsächlich, diese Syntax würde funktionieren. $date -format "yyyMMdd"ist für die Formatierung eines einzelnen Objekts viel intuitiver als '{0:yyyyMMdd}' -f $date.
Orad
Nebenbei: PowerShell hat einen -fOperator (mit der in der akzeptierten Antwort angegebenen Syntax), aber keinen -formatOperator. In der Fehlermeldung wird beanstandet, dass es sich ormatnicht um einen gültigen RHS-Operanden handelt. Beachten Sie jedoch, dass neuere PowerShell-Versionen tatsächlich eine andere, hilfreichere Fehlermeldung Unexpected token '-format' in expression or statement
ausgeben

Antworten:

221

Das gleiche wie in .NET :

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

Oder:

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

Die Frage wird beantwortet, es fehlen jedoch weitere Informationen:

Variable vs. Cmdlet

Sie haben einen Wert in der $DateVariablen und der -fOperator arbeitet in dieser Form : 'format string' -f values. Wenn Sie aufrufen, rufen Get-Date -format "yyyyMMdd"Sie ein Cmdlet mit einigen Parametern auf. Der Wert "yyyyMMdd" ist der Wert für den Parameter Format(try help Get-Date -param Format).

-f Operator

Es gibt viele Formatzeichenfolgen. Schauen Sie zumindest bei Teil1 und Teil2 . Sie benutzt string.Format('format string', values'). Stellen Sie sich das so vor 'format-string' -f values, weil der -fOperator sehr ähnlich wie die string.FormatMethode funktioniert (obwohl es einige Unterschiede gibt (weitere Informationen finden Sie unter Frage unter Stapelüberlauf: Wie genau funktioniert die RHS des PowerShell-Operators -f? ).

stej
quelle
3
Was er sagt ist, dass der Parameter -Format bewirkt, dass Get-DateTime eine Zeichenfolge zurückgibt, kein DateTime-Objekt. Daher kann Ihre Variable $ Date nicht mehr wie erwartet formatiert werden. Ich wünschte WIRKLICH, der Parameter -Format würde einfach das Standardverhalten der ToString-Methode eines bestimmten DateTime-Objekts ändern. Dann würde es funktionieren, wie Sie es erwartet hatten.
Nathan Hartley
19

Eine Sache, die Sie tun könnten, ist:

$date.ToString("yyyyMMdd")
John Weldon
quelle
Danke, dass ich das getan habe - nervt mich, dass -format nicht funktioniert.
Ev.
18

Eine sehr bequeme - aber wahrscheinlich nicht allzu effiziente - Lösung ist die Verwendung der Elementfunktion GetDateTimeFormats().

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

Dies gibt ein großes String-Array von Formatierungsstilen für den Datumswert aus. Sie können dann eines der Elemente des Arrays über den []Operator auswählen, z.

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

Ein einfacher und schöner Weg ist:

$time = (Get-Date).ToString("yyyy:MM:dd")

Stephen Miller
quelle
2
Dies war der einzige Ansatz, der für mich keinen nullwertigen Ausdrucksfehler verursachte. Vielen Dank.
Ecker00
7

Tun Sie dies, wenn Sie die -FormatOption unbedingt verwenden müssen :

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

jedoch

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

ist wahrscheinlich effizienter .. :)

tplive
quelle
$dateStr = (Get-Date $date -Format "yyyMMdd")führt zu einem Objekttyp, der sich von einem Datum / Uhrzeit-Objekt unterscheidet. Versuchen $dateStr = [datetime](Get-Date $date -Format "yyyMMdd") Sie, damit herumzuspielen. Sie werden den Unterschied sofort erkennen.
Jamie Marshall
1
Nun ja ... Es ist ein String, deshalb habe ich ihn dateStr genannt. :) OP hat versucht, ein Datumsobjekt in einen String zu formatieren.
tplive
4

Wenn Sie hierher gekommen sind, um dies in cmd.exe(in einer Batch-Datei) zu verwenden:

powershell -Command (Get-Date).ToString('yyyy-MM-dd')
Jaroslav Záruba
quelle
4

Ich brauchte die Zeit und eine leichte Variation des Formats. Dies funktioniert hervorragend für meine Zwecke:

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

2019-08-16 215757

Laut @ mklement0 in Kommentaren sollte dies das gleiche Ergebnis liefern:

(get-date).ToString("yyyy-MM-dd HHmmss")
Des Teufels Anwalt
quelle
3

Wenn Sie versuchen, das aktuelle Datum für die Verwendung in einem HTTP-Header zu formatieren, verwenden Sie das Format "r" (kurz für RFC1123). Beachten Sie jedoch die ...

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

Dh nicht vergessen, "ToUniversalTime ()" zu verwenden

Peter L.
quelle
Verwenden Sie dies mit "o" für Daten im "xml" -Stil
JohnOpincar