PowerShell中带时区的毫秒时间字符串转DateTime及时间差计算
带时区的ISO时间字符串转DateTime及毫秒级时间差计算
错误原因
你遇到的解析失败问题主要来自两点:
- 格式字符串不匹配:你用的
yyyy-MM-ddTHH:MM:SS.ms存在多处错误:- 分钟需用小写
mm(大写MM是月份),秒用小写ss(无SS格式) - 毫秒部分要写
fff匹配三位毫秒数,不是SS.ms - 未包含时区偏移格式
zzz,无法匹配+02:00部分
- 分钟需用小写
- 输入字符串含多余引号:报错里的字符串是
"2023-03-17T18:37:19.717+02:00",首尾的双引号会导致解析失败,必须先去除。
解决方案
方法1:用DateTime.ParseExact处理
先清理字符串,再用正确的格式字符串解析:
# 示例输入(带引号) $time_start = '"2023-03-17T18:37:19.717+02:00"' $time_end = '"2023-03-17T18:37:20.927+02:00"' # 去除字符串中的双引号 $clean_start = $time_start -replace '"', '' $clean_end = $time_end -replace '"', '' # 匹配ISO格式的正确格式字符串 $format = 'yyyy-MM-ddTHH:mm:ss.fffzzz' # 转换为DateTime(指定AdjustToUniversal统一转UTC,避免时区差异) $date1 = [DateTime]::ParseExact($clean_start, $format, $null, [System.Globalization.DateTimeStyles]::AdjustToUniversal) $date2 = [DateTime]::ParseExact($clean_end, $format, $null, [System.Globalization.DateTimeStyles]::AdjustToUniversal) # 计算毫秒级时间差 $diff_ms = ($date2 - $date1).TotalMilliseconds Write-Host "时间差:$diff_ms 毫秒"
方法2:用DateTimeOffset更适配时区场景
DateTimeOffset原生支持带时区的字符串解析,无需额外处理时区转换:
$time_start = '"2023-03-17T18:37:19.717+02:00"' $time_end = '"2023-03-17T18:37:20.927+02:00"' $clean_start = $time_start -replace '"', '' $clean_end = $time_end -replace '"', '' # 解析为DateTimeOffset类型 $offset1 = [DateTimeOffset]::ParseExact($clean_start, 'yyyy-MM-ddTHH:mm:ss.fffzzz', $null) $offset2 = [DateTimeOffset]::ParseExact($clean_end, 'yyyy-MM-ddTHH:mm:ss.fffzzz', $null) # 计算毫秒差 $diff_ms = ($offset2 - $offset1).TotalMilliseconds Write-Host "时间差:$diff_ms 毫秒"
简化方式:直接用Parse方法
如果你的字符串是标准ISO 8601格式,甚至可以不用指定格式,直接解析:
$clean_start = $time_start -replace '"', '' $date1 = [DateTime]::Parse($clean_start) # 或者用DateTimeOffset $offset1 = [DateTimeOffset]::Parse($clean_start)
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

