Come formattare un DateTime in PowerShell


156

Posso formattare il Get-Datecmdlet senza problemi in questo modo:

$date = Get-Date -format "yyyyMMdd"

Ma una volta che ho una data in una variabile, come posso formattarla? La seguente dichiarazione

$dateStr = $date -format "yyyMMdd"

restituisce questo errore:

"È necessario fornire un'espressione di valore sul lato destro dell'operatore '-f'"


3
In realtà avrei desiderato che questa sintassi funzionasse. $date -format "yyyMMdd"è molto più intuitivo per la formattazione di un singolo oggetto di '{0:yyyyMMdd}' -f $date.
orad,

A parte: PowerShell ha un -foperatore (con la sintassi come mostrato nella risposta accettata), ma nessun -formatoperatore. Il messaggio di errore si lamenta di ormatnon essere un operando RHS valido, ma si noti che le recenti versioni di PowerShell in realtà emettono un messaggio di errore diverso e più utile:Unexpected token '-format' in expression or statement
mklement0

Risposte:


221

Lo stesso che faresti in .NET :

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

O:

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

26

Alla domanda viene data risposta, ma mancano alcune informazioni:

Variabile vs. cmdlet

Si dispone di un valore nella $Datevariabile e l' -foperatore non opera in questa forma: 'format string' -f values. Se si chiama, Get-Date -format "yyyyMMdd"si chiama un cmdlet con alcuni parametri. Il valore "yyyyMMdd" è il valore per il parametro Format(provare help Get-Date -param Format).

-f operatore

Ci sono molte stringhe di formato. Guardate almeno a part1 e part2 . Lei usa string.Format('format string', values'). Pensalo come 'format-string' -f values, perché l' -foperatore funziona in modo molto simile come string.Formatmetodo (anche se ci sono alcune differenze (per maggiori informazioni guarda la domanda su Stack Overflow: come funziona esattamente l'RHS dell'operatore -f di PowerShell? ).


3
Quello che sta dicendo è che il parametro -Format fa sì che Get-DateTime restituisca una stringa, non un oggetto DateTime. Quindi la tua variabile $ Date non può più essere formattata come previsto. Vorrei davvero che il parametro -Format cambiasse semplicemente il comportamento predefinito di un metodo ToString di un particolare oggetto DateTime. Quindi funzionerebbe come ti aspettavi.
Nathan Hartley,

19

Una cosa che potresti fare è:

$date.ToString("yyyyMMdd")

Grazie, l'ho fatto, mi dà fastidio, tuttavia il formato non funziona.
Ev.

18

Una soluzione molto conveniente, ma probabilmente non troppo efficiente, è utilizzare la funzione membro GetDateTimeFormats(),

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

Ciò genera un ampio array di stringhe di stili di formattazione per il valore data. È quindi possibile selezionare uno degli elementi dell'array tramite l' []operatore, ad es.

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

16

Un modo semplice e carino è:

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


2
Questo è stato l'unico approccio che non ha generato un errore di espressione a valore zero per me. Grazie.
Ecker00,

7

Fallo se hai assolutamente bisogno di usare l' -Formatopzione:

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

però

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

è probabilmente più efficiente .. :)


$dateStr = (Get-Date $date -Format "yyyMMdd")genera un tipo di oggetto diverso da un oggetto datetime. Prova a giocare con questo $dateStr = [datetime](Get-Date $date -Format "yyyMMdd") Vedrai subito la differenza.
Jamie Marshall,

1
Bene, sì .. È una stringa, ecco perché l'ho chiamato dateStr .. :) OP stava cercando di formattare un oggetto data in una stringa.
tplive

4

Se sei arrivato qui per usarlo in cmd.exe(in un file batch):

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

4

Avevo bisogno di tempo e una leggera variazione sul formato. Questo funziona alla grande per i miei scopi:

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

16-08-2019 215757

Secondo @ mklement0 nei commenti, questo dovrebbe produrre lo stesso risultato:

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


3

Per chiunque cerchi di formattare la data corrente per l'uso in un'intestazione HTTP, usa il formato "r" (abbreviazione di RFC1123) ma fai attenzione ...

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

Vale a dire non dimenticare di usare "ToUniversalTime ()"


Usalo con "o" per i
periodi di
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.