Convertir la chaîne en DateTime dans Powershell à partir de CSV
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
-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: