Powershell 将CSV日期字符串转换为其他格式

Powershell 将CSV日期字符串转换为其他格式,powershell,csv,Powershell,Csv,我得到了一个带有日期列的CSV文件,格式为dd/MM/YYY HH:MM:ss,例如14/11/2016 00:00:00 我正在尝试将该列上的格式批量转换为ISO-8601日期格式:YYYY-mm-dd HH:mm:ss 我尝试过:(我编辑过输入字符串格式时出错…) 我得到一个错误: Cannot find an overload for "ParseExact" and the argument count: "2". At line:1 char:69 + ... Date]' ; ([d

我得到了一个带有日期列的CSV文件,格式为
dd/MM/YYY HH:MM:ss
,例如
14/11/2016 00:00:00

我正在尝试将该列上的格式批量转换为ISO-8601日期格式:
YYYY-mm-dd HH:mm:ss

我尝试过:(我编辑过输入字符串格式时出错…)

我得到一个错误:

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 找不到“ParseExact”和参数计数“2”的重载。 第1行字符:69 + ... 日期];([datetime]::ParseExact($),“dd/MM/yyyy HH…”。。。 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:NotSpecified:(:)[],MethodException +FullyQualifiedErrorId:MethodCountNotFindBest 我已经看了一眼,试着用Try-parse和sever来解析一些想法,但没有什么好做的


我不知道我出了什么问题。有什么建议吗?

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/yyyy HH:MM:ss
,而不是
dd/MM/yyyy,HH:MM:ss

匹配年份的格式必须是
yyyyy
(小写
y
),示例日期中没有逗号,您需要为提供区域性信息。我还建议避开正斜杠,否则它们将匹配计算机区域设置中配置的任何日期分隔符。并且您需要将修改后的记录回显到管道中,否则将无法导出任何内容。

$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
$culture=[Globalization.CultureInfo]::不变量文化
导入Csv someCSV.Csv | ForEach对象{
$.'[Date]'=[DateTime]::ParseExact($.'[Date]','dd\/MM\/yyyy HH:MM:ss',$culture).ToString('yyyyy-MM-dd HH:MM:ss'))

$u#ParseExact需要三个参数。为什么人们实际上无法读取错误消息,这是怎么回事?这不会起作用。您的输入格式字符串仍然无效,并且不会创建输出,因为您不会将修改后的记录反馈回管道。区域性不需要作为参数进入ParseExact函数吗?@maco1717确实是这样。修正了。
$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