使用PowerShell修正CSV文件日期:转UK格式并补全缺失秒数
CSV日期时间格式转换修复方案
需求说明
需要将CSV中的US格式日期(MM/dd/yyyy)转换为UK格式(dd/MM/yyyy),同时为缺失秒数的时间记录补全:00。
示例CSV数据
Time,Incident 03/25/2021 12:59:49,INC18072411 04/03/2021 13:00,INC17989469 05/14/2021 13:01:57,INC17987450 05/28/2021 13:02:56,INC18000995 06/01/2021 13:06,INC17990104 06/06/2021 13:06:23,INC17983804 07/19/2021 13:07,INC17973858 08/08/2021 13:08:04,INC17987287 09/20/2021 13:08:19,INC17986031 10/10/2021 13:13,INC17926602
原代码问题
尝试的代码仅指定了带秒数的时间格式,导致缺失秒数的记录无法被解析,抛出错误:
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
原代码:
Import-Csv $CsvPath | ForEach-Object { ([datetime]::ParseExact($_.Time,"MM/dd/yyyy HH:mm:ss",$null)).ToString('dd/MM/yyyy H:mm:ss') } | Export-Csv $CsvUpdatedPath -NoTypeInformation
解决方法
方法1:支持多格式解析(推荐)
使用ParseExact的多格式重载,同时匹配带秒和不带秒的时间字符串,确保所有记录都能被正确解析:
Import-Csv $CsvPath | ForEach-Object { # 定义两种可能的时间格式 $timeFormats = @("MM/dd/yyyy HH:mm:ss", "MM/dd/yyyy HH:mm") # 尝试匹配任意一种格式解析时间 $parsedDateTime = [datetime]::ParseExact($_.Time, $timeFormats, $null, [System.Globalization.DateTimeStyles]::None) # 构造包含转换后时间和原事件编号的对象 [PSCustomObject]@{ Time = $parsedDateTime.ToString('dd/MM/yyyy HH:mm:ss') Incident = $_.Incident } } | Export-Csv $CsvUpdatedPath -NoTypeInformation
方法2:先补全秒数再解析
先检查时间字符串是否包含秒数,缺失则补:00,再用统一格式解析:
Import-Csv $CsvPath | ForEach-Object { $timeStr = $_.Time # 检查时间部分是否缺少秒数,补全:00 if ($timeStr -notmatch ':\d{2}$') { $timeStr += ":00" } # 用统一格式解析时间 $parsedDateTime = [datetime]::ParseExact($timeStr, "MM/dd/yyyy HH:mm:ss", $null) # 输出转换后的完整记录 [PSCustomObject]@{ Time = $parsedDateTime.ToString('dd/MM/yyyy HH:mm:ss') Incident = $_.Incident } } | Export-Csv $CsvUpdatedPath -NoTypeInformation
注意事项
- 原代码仅输出转换后的时间,会丢失
Incident字段,上述两种方法均保留了原始CSV的所有字段。 - 若CSV中存在其他时间格式变体,可在
$timeFormats数组中添加对应格式字符串。
内容的提问来源于stack exchange,提问作者TripToBelize
相关产品推荐
相关产品推荐

