Comment mettre en forme un DateTime dans PowerShell


156

Je peux formater l' Get-Dateapplet de commande sans problème comme ceci:

$date = Get-Date -format "yyyyMMdd"

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

$dateStr = $date -format "yyyMMdd"

renvoie cette erreur:

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


3
J'aurais souhaité que cette syntaxe fonctionne. $date -format "yyyMMdd"est beaucoup plus intuitif pour formater un seul objet que '{0:yyyyMMdd}' -f $date.
— orad

En aparté: PowerShell a un -fopérateur (avec la syntaxe indiquée dans la réponse acceptée), mais pas d' -formatopérateur. Le message d'erreur se plaint de ormatne pas être un opérande RHS valide, mais notez que les versions récentes de PowerShell émettent en fait un message d'erreur différent et plus utile:Unexpected token '-format' in expression or statement
— mklement0

Réponses:


221

Comme vous le feriez dans .NET :

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

Ou:

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

26

La question est répondue, mais il manque quelques informations supplémentaires:

Variable vs cmdlet

Vous avez une valeur dans la $Datevariable et l' -fopérateur FONCTIONNE sous cette forme: 'format string' -f values. Si vous appelez, Get-Date -format "yyyyMMdd"vous appelez une applet de commande avec certains paramètres. La valeur "aaaaMMjj" est la valeur du paramètre Format(essayez help Get-Date -param Format).

-f opérateur

Il existe de nombreuses chaînes de format. Regardez au moins part1 et part2 . Elle utilise string.Format('format string', values'). Considérez-le comme 'format-string' -f values, parce que l' -fopérateur fonctionne de manière très similaire en tant que string.Formatméthode (bien qu'il y ait quelques différences (pour plus d'informations, consultez la question sur Stack Overflow: Comment fonctionne exactement le RHS de l'opérateur -f de PowerShell? ).


3
Ce qu'il dit, c'est que le paramètre -Format oblige Get-DateTime à renvoyer une chaîne, pas un objet DateTime. Ainsi, votre variable $ Date ne peut plus être formatée comme prévu. Je souhaite VRAIMENT que le paramètre -Format modifie simplement le comportement par défaut de la méthode ToString d'un objet DateTime particulier. Ensuite, cela fonctionnerait comme vous l'aviez prévu.
— Nathan Hartley le

19

Une chose que vous pourriez faire est:

$date.ToString("yyyyMMdd")

Merci d'avoir fait ça - ça me dérange que -format ne fonctionne pas.
— Ev.

18

Une solution très pratique - mais probablement pas trop efficace - consiste à utiliser la fonction membre GetDateTimeFormats(),

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

Cela génère un grand tableau de chaînes de styles de mise en forme pour la valeur de date. Vous pouvez alors choisir l'un des éléments du tableau via l' []opérateur, par exemple,

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

16

Une manière simple et agréable est:

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


2
C'était la seule approche qui n'a pas généré d'erreur d'expression de valeur nulle pour moi. Merci.
— Ecker00

7

Faites ceci si vous devez absolument utiliser l' -Formatoption:

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

toutefois

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

est probablement plus efficace .. :)


$dateStr = (Get-Date $date -Format "yyyMMdd")génère un type d'objet différent d'un objet datetime. Essayez de jouer avec cela $dateStr = [datetime](Get-Date $date -Format "yyyMMdd") Vous verrez tout de suite la différence.
— Jamie Marshall

1
Eh bien, ouais .. C'est une chaîne, c'est pourquoi je l'ai nommée dateStr .. :) OP essayait de formater un objet date en une chaîne.
— tplive le

4

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

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

4

J'avais besoin de 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")

16/08/2019 215757

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

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


3

Pour quiconque essaie de formater la date actuelle pour une utilisation dans un en-tête HTTP, utilisez le format "r" (abréviation de RFC1123), mais attention à la mise en garde ...

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

Ie N'oubliez pas d'utiliser "ToUniversalTime ()"


Utilisez ceci avec "o" pour les
— dates
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.