Powershell以CSV格式转换日期格式

时间:2016-09-08 17:47:09

标签: powershell csv

我有一个包含以下数据的CSV文件

"Date","Time","Name","SourceIP","DestinationIP"
"Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"
"Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"
"Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"
"Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"

我想将日期转换为更有用的东西,比如09-01-2016(今年将是当年)。 我怎么能做到这一点?

1 个答案:

答案 0 :(得分:2)

使用[DateTime]类的ParseExact方法很容易。您提供了一个日期字符串,您告诉它如何格式化日期,并提供文化或提供者或其他东西,但我总是使用$null

[datetime]::ParseExact("Sep  1","MMM  d",$null)

结果是:

Thursday, September 1, 2016 12:00:00 AM

所以你可以这样做:

$Array | ForEach{[datetime]::ParseExact($_.Date,"MMM  d",$null)}

这会将每个条目的Date属性转换为有效的[datetime]对象。然后你可以根据需要格式化它:

$Array | ForEach{[datetime]::ParseExact($_.Date,"MMM  d",$null).ToString("M-d-yyyy")}

那会输出:

9-1-2016

或者您要求使用"MM-dd-yyyy"获取09-01-2016的确切内容。

编辑:感谢wOxxOm在处理非本地化日期格式时教育我第三个参数的必要性!因此,如果需要针对其他文化进行本地化,则需要包含最后一个参数。这可以这样做:

$Culture = [cultureinfo]::GetCultureInfoByIetfLanguageTag('en-US')
$Array | ForEach{[datetime]::ParseExact($_.Date,"MMM  d",$Culture).ToString("MM-dd-yyyy")}

Edit2:好的,要使用此信息替换当前的Date字段,您可以将数组传递给Select命令,并创建新的Date动态属性,丢弃原始属性,然后将其传递给Export-CSV

$Array | Select *,@{l='Date';e={[datetime]::ParseExact($_.Date,"MMM  d",$null).ToString("M-d-yyyy")}} -Exclude Date | Export-CSV D-Sample-2.csv -NoType