Cómo formatear un DateTime en PowerShell

156

Puedo formatear el Get-Datecmdlet sin problemas como este:

$date = Get-Date -format "yyyyMMdd"

Pero una vez que tengo una fecha en una variable, ¿cómo la formateo? La siguiente declaración

$dateStr = $date -format "yyyMMdd"

devuelve este error:

"Debe proporcionar una expresión de valor en el lado derecho del operador '-f'"

Ev.
fuente
3
Realmente deseaba que esta sintaxis funcionara. $date -format "yyyMMdd"es mucho más intuitivo para formatear un solo objeto que '{0:yyyyMMdd}' -f $date.
orad
Como comentario aparte: PowerShell tiene un -foperador (con la sintaxis como se muestra en la respuesta aceptada), pero no tiene -formatoperador. El mensaje de error se queja de que ormatno es un operando RHS válido, pero tenga en cuenta que las versiones recientes de PowerShell realmente emiten un mensaje de error diferente y más útil:Unexpected token '-format' in expression or statement
mklement0

Respuestas:

221

Lo mismo que lo haría en .NET :

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

O:

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

La pregunta se responde, pero falta más información:

Variable vs Cmdlet

Usted tiene un valor en el $Datevariable y el -foperador funciona en este formulario: 'format string' -f values. Si llama Get-Date -format "yyyyMMdd", llame a un cmdlet con algunos parámetros. El valor "aaaamMMdd" es el valor del parámetro Format(try help Get-Date -param Format).

-f operador

Hay muchas cadenas de formato. Mira lo menos en parte 1 y parte 2 . Ella utiliza string.Format('format string', values'). Piense en ello como 'format-string' -f valuesporque el -foperador funciona de manera muy similar al string.Formatmétodo (aunque existen algunas diferencias (para obtener más información, consulte la pregunta en Desbordamiento de pila: ¿cómo funciona exactamente el RHS del operador -f de PowerShell? ).

stej
fuente
3
Lo que está diciendo es que el parámetro -Format hace que Get-DateTime devuelva una cadena, no un objeto DateTime. Por lo tanto, su variable $ Date ya no se puede formatear como se esperaba. REALMENTE deseo que el parámetro -Format simplemente cambie el comportamiento predeterminado del método ToString de un objeto DateTime particular. Entonces funcionaría como esperabas.
Nathan Hartley
19

Una cosa que puedes hacer es:

$date.ToString("yyyyMMdd")
John Weldon
fuente
Gracias, hice esto, me molesta que el formato no funcione.
Ev.
18

Una solución muy conveniente, pero probablemente no demasiado eficiente, es utilizar la función miembro GetDateTimeFormats(),

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

Esto genera una gran variedad de estilos de formato para el valor de fecha. Luego puede elegir uno de los elementos de la matriz a través del []operador, por ejemplo,

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

Una manera simple y agradable es:

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

Stephen Miller
fuente
2
Este fue el único enfoque que no arrojó un error de expresión de valor nulo para mí. Gracias.
Ecker00
7

Haga esto si absolutamente necesita usar la -Formatopción:

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

sin embargo

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

es probablemente más eficiente .. :)

tplive
fuente
$dateStr = (Get-Date $date -Format "yyyMMdd")da como resultado un tipo de objeto que es diferente de un objeto datetime. Intenta jugar con esto $dateStr = [datetime](Get-Date $date -Format "yyyMMdd") . Verás la diferencia de inmediato.
Jamie Marshall
1
Bueno, sí ... Es una cadena, por eso lo llamé dateStr ... :) OP estaba tratando de formatear un objeto de fecha en una cadena.
tplive
4

Si llegó aquí para usar esto en cmd.exe(en un archivo por lotes):

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

Necesitaba el tiempo y una ligera variación en el formato. Esto funciona muy bien para mis propósitos:

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

2019-08-16 215757

Según @ mklement0 en los comentarios, esto debería arrojar el mismo resultado:

(get-date).ToString("yyyy-MM-dd HHmmss")
Abogado del diablo
fuente
3

Para cualquiera que intente formatear la fecha actual para usar en un encabezado HTTP, use el formato "r" (abreviatura de RFC1123) pero tenga cuidado con la advertencia ...

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

Es decir, no olvides usar "ToUniversalTime ()"

Peter L
fuente
Use esto con "o" para
fechas de