Como formatar um DateTime no PowerShell

156

Posso formatar o Get-Datecmdlet sem problemas como este:

$date = Get-Date -format "yyyyMMdd"

Mas uma vez que eu tenho uma data em uma variável, como a formato? A declaração abaixo

$dateStr = $date -format "yyyMMdd"

retorna este erro:

"Você deve fornecer uma expressão de valor no lado direito do operador '-f'"

Ev.
fonte
3
Na verdade, eu desejei que essa sintaxe funcionasse. $date -format "yyyMMdd"é muito mais intuitivo para formatar um único objeto do que '{0:yyyyMMdd}' -f $date.
orad
Como um aparte: O PowerShell possui um -foperador (com a sintaxe mostrada na resposta aceita), mas nenhum -formatoperador. A mensagem de erro está reclamando de ormatnão ser um operando RHS válido, mas observe que as versões recentes do PowerShell emitem uma mensagem de erro diferente e mais útil:Unexpected token '-format' in expression or statement
mklement0

Respostas:

221

O mesmo que você faria no .NET :

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

Ou:

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

A pergunta é respondida, mas há mais algumas informações ausentes:

Variável vs. Cmdlet

Você tem um valor na $Datevariável eo -foperador não funciona desta forma: 'format string' -f values. Se você chamar, Get-Date -format "yyyyMMdd"chame um cmdlet com alguns parâmetros. O valor "aaaamMMdd" é o valor do parâmetro Format(try help Get-Date -param Format).

-f operador

Existem várias seqüências de formato. Veja pelo menos a parte1 e a parte2 . Ela usa string.Format('format string', values'). Pense nisso como 'format-string' -f values, porque o -foperador trabalha de maneira muito semelhante ao string.Formatmétodo (embora existam algumas diferenças (para obter mais informações, veja a pergunta no Stack Overflow: Como exatamente o RHS do operador -f do PowerShell funciona )).

stej
fonte
3
O que ele está dizendo é que o parâmetro -Format faz com que Get-DateTime retorne uma string, não um objeto DateTime. Portanto, sua variável $ Date não pode mais ser formatada conforme o esperado. Eu realmente desejo que o parâmetro -Format simplesmente altere o comportamento padrão do método ToString de um objeto DateTime específico. Então funcionaria como você esperava.
Nathan Hartley
19

Uma coisa que você pode fazer é:

$date.ToString("yyyyMMdd")
John Weldon
fonte
Graças eu fiz isso - me incomoda que -format não funciona embora.
Ev.
18

Uma solução muito conveniente - mas provavelmente nem muito eficiente - é usar a função membro GetDateTimeFormats(),

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

Isso gera uma grande variedade de estilos de formatação para o valor da data. Você pode escolher um dos elementos da matriz via []-operator, por exemplo,

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

Uma maneira simples e agradável é:

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

Stephen Miller
fonte
2
Essa foi a única abordagem que não gerou um erro de expressão com valor nulo para mim. Obrigado.
precisa saber é o seguinte
7

Faça isso se você absolutamente precisar usar a -Formatopção:

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

Contudo

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

é provavelmente mais eficiente .. :)

tplive
fonte
$dateStr = (Get-Date $date -Format "yyyMMdd")resulta em um tipo de objeto diferente de um objeto datetime. Tente brincar com isso $dateStr = [datetime](Get-Date $date -Format "yyyMMdd") Você verá a diferença imediatamente.
21717 Jamie Marshall
1
Bem, sim ... É uma String, foi por isso que o nomeei dateStr .. :) OP estava tentando formatar um objeto de data para uma String.
tplive
4

Se você chegou aqui para usá-lo cmd.exe(em um arquivo em lotes):

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

Eu precisava do tempo e uma ligeira variação no formato. Isso funciona muito bem para meus propósitos:

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

2019-08-16 215757

De acordo com @ mklement0 nos comentários, isso deve render o mesmo resultado:

(get-date).ToString("yyyy-MM-dd HHmmss")
Advogado do diabo
fonte
3

Para qualquer pessoa que esteja tentando formatar a data atual para uso em um cabeçalho HTTP, use o formato "r" (abreviação de RFC1123), mas cuidado com o aviso ...

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

Ou seja, não se esqueça de usar "ToUniversalTime ()"

Peter L
fonte
Use isto com "o" para "XML" datetimes estilo
JohnOpincar