Преобразование строки в DateTime в Powershell из CSV

Sep 12 2020

У меня самая странная и раздражающая проблема с работой со строкой, которую мне нужно преобразовать в DateTime.

Я делаю то же самое из двух разных файлов CSV - он отлично работает с первым, продолжает возвращать ошибку во втором.

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

В первом CSV Date_OUT - это просто 31/12/2021пример, а во втором - 31/12/2021 0:00:00.

Итак, перед созданием трех строк $userDateOutя делаю

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

Из-за этого я получаю тот же тип переменной, что и в первом 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

Однако с этой переменной я получаю

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

И я не знаю почему ... Кто-нибудь может помочь?

Ответы

3 MathiasR.Jessen Sep 11 2020 at 22:45

-Formatтолько обращенные [datetime]к [string]- это не влияет на разборе входных строк в любом пути.

Для этого вам понадобится [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)

Затем вы можете использовать его Get-Date -Formatдля преобразования обратно в предполагаемый выходной формат, если это необходимо: