我收到了一个CSV文件,其中包含格式为dd/MM/YYY HH:mm:ss
的日期列,例如14/11/2016 00:00:00
。
我正在尝试将该列的格式化批量转换为ISO-8601日期格式:YYYY-mm-dd HH:mm:ss
我试过:(我编辑过输入字符串格式有错误...)
Import-Csv someCSV.csv | % {
$_.'[Date]' = ([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYYY HH:mm:ss").ToString('yyyy-MM-dd HH:mm:ss'))
} | Export-Csv 'C:\testBis.csv' -NoTypeInformation
我收到了一个错误:
Cannot find an overload for "ParseExact" and the argument count: "2". At line:1 char:69 + ... Date]' ; ([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYY HH ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodException + FullyQualifiedErrorId : MethodCountCouldNotFindBest
我已经看了一眼并试着尝试解析并切断一些想法,但没有任何缝隙可以工作。
我不知道我错了什么。有什么建议吗?
答案 0 :(得分:1)
匹配年份的pattern必须为yyyy
(小写y
),您的样本日期中没有逗号,并且您需要提供{{3的文化信息}}。我还建议逃避正斜杠,否则他们将匹配计算机区域设置中配置的日期分隔符。并且您需要将修改后的记录回送到管道,否则无法导出。
$culture = [Globalization.CultureInfo]::InvariantCulture
Import-Csv someCSV.csv | ForEach-Object {
$_.'[Date]' = [DateTime]::ParseExact($_.'[Date]', 'dd\/MM\/yyyy HH:mm:ss', $culture).ToString('yyyy-MM-dd HH:mm:ss')
$_ # <-- feed modified record back into pipeline
} | Export-Csv 'C:\testBis.csv' -NoType
答案 1 :(得分:0)
DateTime.ParseExact至少需要三个参数。第三个参数是要使用的文化。您可以传递不变文化[System.Globalization.CultureInfo]::InvariantCulture
,例如:
([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYYY HH:mm:ss",[System.Globalization.CultureInfo]::InvariantCulture)
或更清洁的版本:
$inv = [System.Globalization.CultureInfo]::InvariantCulture
$fmtFrom = "dd/MM/YYY HH:mm:ss"
$fmtTo = "yyyy-MM-dd HH:mm:ss"
Import-Csv someCSV.csv | % {
$_.'[Date]' = ([datetime]::ParseExact(($_.'[Date]'),$fmtFrom, $inv).ToString($fmtTo))
} | Export-Csv 'C:\testBis.csv' -NoTypeInformation
我从格式字符串中删除了,
,因为您提到实际格式为dd/MM/YYY HH:mm:ss
,而不是dd/MM/YYY, HH:mm:ss