Ubah string menjadi DateTime di Powershell dari CSV
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
-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: