Ubah string menjadi DateTime di Powershell dari CSV

Sep 12 2020

Saya mengalami masalah paling aneh dan menjengkelkan dengan berurusan dengan string di sini yang perlu saya ubah ke DateTime.

Saya melakukan hal yang sama persis dari 2 file CSV yang berbeda - ini berfungsi dengan sempurna pada yang pertama, terus mengembalikan kesalahan pada yang kedua.

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

Di CSV pertama, Date_OUT hanyalah 31/12/2021sebagai contoh, dan yang kedua adalah contoh 31/12/2021 0:00:00.

Jadi sebelum 3 baris dibuat $userDateOut, saya lakukan

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

Yang membuat saya berakhir dengan jenis variabel yang sama dengan CSV pertama

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

Namun, dengan variabel ini, saya mendapatkan

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

Dan aku tidak tahu kenapa ... Adakah yang bisa membantu?

Jawaban

3 MathiasR.Jessen Sep 11 2020 at 22:45

-Formathanya mengonversi [datetime]menjadi [string]- tidak memengaruhi penguraian string input dengan cara apa pun .

Untuk itu, Anda membutuhkan [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)

Anda kemudian dapat menggunakan Get-Date -Formatuntuk mengubahnya kembali ke format keluaran yang diinginkan jika diperlukan: