245 votes

Comment formater un DateTime en PowerShell

Je peux formater le Get-Date cmdlet sans problème de cette manière :

$date = Get-Date -format "yyyyMMdd"

Mais une fois que j'ai une date dans une variable, comment la formater ? La commande ci-dessous

$dateStr = $date -format "yyyMMdd"

renvoie cette erreur :

"Vous devez fournir une expression de valeur du côté droit de l'opérateur '-f'"

5 votes

Je souhaitais en fait que cette syntaxe fonctionne. $date -format "yyyMMdd" est beaucoup plus intuitive pour formater un seul objet que '{0:yyyyMMdd}' -f $date.

0 votes

En aparté : PowerShell possède un opérateur -f (avec la syntaxe indiquée dans la réponse acceptée), mais aucun opérateur -format. Le message d'erreur se plaint du fait que ormat n'est pas un opérande RHS valide, mais notez que les versions récentes de PowerShell émettent en réalité un message d'erreur différent et plus utile : Unexpected token '-format' in expression or statement

1 votes

@orad votre commentaire fait beaucoup plus pour expliquer la syntaxe boilerplate "{0:...}" que la réponse en tête et acceptée qui le suggère. Merci. (Votre commentaire nous indique qu'il s'agit d'un cas particulier de quelque chose qui prend en charge plusieurs choses formatées à la fois, ce qui nous permet de réaliser que nous sommes en train de regarder quelque chose de bien plus général que simplement du sucre syntaxique pour .ToString(...)... et que, combiné à une expérience de programmation suffisante, nous pouvons deviner que les chaînes de format utilisent des références indexées à zéro des objets interpolés, et utilisent {} pour envelopper les espaces réservés.)

13voto

tplive Points 162

Faites cela si vous avez absolument besoin d'utiliser l'option -Format :

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

Cependant

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

est probablement plus efficace.. :)

0 votes

$dateStr = (Get-Date $date -Format "yyyMMdd") résulte en un type d'objet différent d'un objet datetime. Essayez de jouer avec ceci $dateStr = [datetime](Get-Date $date -Format "yyyMMdd") Vous verrez immédiatement la différence.

1 votes

Eh bien, oui.. C'est une chaîne de caractères, c'est pourquoi je l'ai nommée dateStr.. :) L'OP essayait de formater un objet date en une chaîne de caractères.

7voto

Scott Beeson Points 1999

J'avais besoin du temps et d'une légère variation de format. Cela fonctionne très bien pour mes besoins :

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

2019-08-16 215757

Selon @mklement0 dans les commentaires, cela devrait donner le même résultat :

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

6voto

Jaroslav Záruba Points 1059

Si vous êtes arrivé ici pour utiliser ceci dans cmd.exe (dans un fichier batch) :

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

6voto

Peter L Points 474

Pour quiconque essaie de formater la date actuelle pour l'utiliser dans un en-tête HTTP, utilisez le format "r" (abrégé de RFC1123) mais attention au piège...

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

C'est-à-dire, n'oubliez pas d'utiliser "ToUniversalTime()"

1 votes

Utilisez ceci avec "o" pour les datetimes au style "xml"

5voto

Eddie Kumar Points 364

Très instructive réponse de @stej, mais voici une réponse courte : Parmi d'autres options, vous avez 3 options simples pour formater [System.DateTime] stocké dans une variable :

  1. Transmettez la variable à la cmdlet Get-Date : Get-Date -Format "HH:mm" $date

  2. Utilisez la méthode toString() : $date.ToString("HH:mm")

  3. Utilisez le formatage composite : "{0:HH:mm}" -f $date

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X