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.