PowerShell中[DateTime]::TryParseExact对两个外观相同字符串解析结果不一致问题
问题定位与解决方法
第一步:逐字符对比字符串编码,排查不可见/非标准字符
两个字符串打印外观一致但实际内容不同,几乎都是由不可见字符或者全角/半角字符差异导致的,使用以下方法输出每个字符的Unicode编码直接对比:
# 输出字符串每个字符的对应Unicode编码 function Show-StringCharCodes { param([string]$str) Write-Host "字符串长度: $($str.Length)" for ($i=0; $i -lt $str.Length; $i++) { Write-Host "索引 $i : 字符 '$($str[$i])' , 编码 $([int]$str[$i])" } } # 调用方法对比两个字符串 Show-StringCharCodes $date Show-StringCharCodes $inputDate
常见差异类型:
- 长度不同:说明
$inputDate首尾存在空白、换行、零宽空格(Unicode编码8203)、不间断空格(Unicode编码160)等打印不可见的字符 - 相同索引位置编码不同:最常见为日期分隔符实际为全角斜杠
/(编码65295)、时间冒号为全角冒号:(编码65306),和半角符号外观几乎无差异
第二步:快速验证解析问题
如果确认是字符格式问题,可以先对输入做清洗后再尝试解析:
# 移除所有不可见控制字符 $cleanInput = $inputDate -replace '[\p{C}]','' # 统一替换全角分隔符为半角 $cleanInput = $cleanInput -replace '/','/' -replace ':',':' # 再次尝试解析 $parsedSuccessfully = [DateTime]::TryParseExact($cleanInput, "dd/MM/yyyy HH:mm", $null, [System.Globalization.DateTimeStyles]::None, [ref]$parsedDate)
常见隐藏坑点说明
TryParseExact方法的格式字符串中,/是日期分隔符占位符,默认会被替换为当前系统区域的默认日期分隔符,不是严格匹配半角斜杠。如果要强制匹配半角斜杠,需要把格式字符串转义为:"dd'/'MM'/'yyyy HH:mm"
内容的提问来源于stack exchange,提问作者delp
相关产品推荐
相关产品推荐

