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.)

317voto

Josh Points 38617

Comme vous le feriez en .NET:

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

Ou:

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

Notez que vous pouvez avoir une chaîne de formatage qui prend plusieurs objets. Par exemple:

'De {0:M/d/yyyy} à {1:M/d/yyyy}' -f $Date, $Date.AddDays(7)

5 votes

Résultats: Vous ne pouvez pas appeler une méthode sur une expression de valeur nulle.

2 votes

@Langdon - En supposant que vous utilisez le formulaire $Date.ToString (...) alors cette erreur est due au fait que votre variable $Date contient Null. Vous devrez vous assurer d'avoir effectivement assigné une valeur DateTime avant d'appeler ToString. ... La deuxième forme (en utilisant l'opérateur -f) semble tolérer les valeurs nulles et produira simplement une chaîne vide.

0 votes

Je veux +1 mais l'apparence totalement cryptique de "0:" et l'enveloppement de "{...}" sans explication est vraiment rebutante pour moi. Pourquoi sont-ils là? que disent-ils à PowerShell ou à l'opérateur "-f" ou à [...]?

56voto

Stephen Miller Points 510

Une façon simple et agréable est:

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

5 votes

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

1 votes

Euh, est-ce que cela retourne la date formatée en 24 heures ou est-ce que je suis trop centré sur les États-Unis ???

0 votes

C'est dans n'importe quel format que vous spécifiez. Peu importe votre lieu d'origine.

34voto

stej Points 14257

La question est répondue, mais il manque encore certaines informations :

Variable vs Cmdlet

Vous avez une valeur dans la variable $Date et l'opérateur -f fonctionne sous cette forme : 'chaîne de format' -f valeurs. Si vous appelez Get-Date -format "yyyyMMdd", vous appelez un cmdlet avec certains paramètres. La valeur "yyyyMMdd" est la valeur du paramètre Format (essayez help Get-Date -param Format).

Opérateur -f

Il existe de nombreuses chaînes de format. Regardez au moins la partie 1 et la partie 2. Elle utilise string.Format('chaîne de format', valeurs'). Pensez à cela comme à 'chaîne-de-format' -f valeurs, car l'opérateur -f fonctionne de manière très similaire à la méthode string.Format (bien qu'il y ait quelques différences, pour plus d'informations, consultez la question sur Stack Overflow : Comment exactement fonctionne le RHS de l'opérateur -f de PowerShell ?).

6 votes

Ce qu'il dit, c'est que le paramètre -Format fait en sorte que Get-DateTime renvoie une chaîne de caractères, pas un objet DateTime. Donc votre variable $Date ne peut plus être formatée comme prévu. Je souhaite VRAIMENT que le paramètre -Format change simplement le comportement par défaut de la méthode ToString d'un objet DateTime particulier. Alors cela fonctionnerait comme vous l'aviez prévu.

0 votes

Soit mettez des exemples ou ajoutez vos commentaires à la réponse sélectionnée. À mon avis

28voto

davidhigh Points 827

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

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

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

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

0 votes

J'aime cette réponse car elle nous encourage à explorer les possibilités.

23voto

John Weldon Points 19132

Une chose que vous pourriez faire est :

$date.ToString("yyyyMMdd")

0 votes

Merci, j'ai fait cela - ça me dérange que -format ne fonctionne pas cependant.

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