Convertir la chaîne en DateTime dans Powershell à partir de CSV

Sep 12 2020

J'ai le problème le plus étrange et le plus ennuyeux de traiter ici une chaîne que j'ai besoin de convertir en DateTime.

Je fais exactement la même chose à partir de 2 fichiers CSV différents - cela fonctionne parfaitement sur le premier, continue de renvoyer une erreur sur le second.

$userDateOut = Get-Date $sourceLine.Date_OUT -Format "dd/MM/yyyy"
$userDateOut = ($userDateOut -as [datetime]).AddDays(+1)
$userDateOut = Get-Date $userDateOut -Format "dd/MM/yyyy"

Dans le premier CSV, Date_OUT est juste 31/12/2021par exemple, et dans le second c'est 31/12/2021 0:00:00.

Alors avant les 3 lignes à créer $userDateOut, je fais

$userDateOut = $sourceLine.Date_OUT.SubString(0,10)

Ce qui me fait me retrouver avec le même type de variable qu'avec le premier CSV

PS C:\Windows\system32> $userDateOut = $sourceLine.Date_Out.Substring(0,10) PS C:\Windows\system32> $userDateOut
31/12/2021
PS C:\Windows\system32> $userDateOut.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

Cependant, avec cette variable, j'obtiens

PS C:\Windows\system32> $userDateOut = Get-Date $userDateOut -Format "dd/MM/yyyy" Get-Date : Cannot bind parameter 'Date'. Cannot convert value "31/12/2021" to type "System.DateTime". Error: "String was not recognized as a valid DateTime." At line:1 char:25 + $userDateOut = Get-Date $userDateOut -Format "dd/MM/yyyy"
+                         ~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-Date], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetDateCommand

Et je ne sais pas pourquoi ... Quelqu'un peut-il aider?

Réponses

3 MathiasR.Jessen Sep 11 2020 at 22:45

-Formatconvertit simplement [datetime]en a [string]- cela n'influence en aucune façon l' analyse des chaînes d'entrée .

Pour cela, il vous faut [datetime]::ParseExact():

$dateString = '31/12/2021' # You can pass multiple accepted formats to ParseExact, this should cover both CSV files $inputFormats = @(
  'dd/MM/yyyy H:mm:ss'
  'dd/MM/yyyy'
)

$parsedDatetime = [datetime]::ParseExact($dateString, $inputFormat, $null)

Vous pouvez ensuite l'utiliser Get-Date -Formatpour le reconvertir dans un format de sortie prévu si nécessaire: