You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中[datetime]::ParseExact解析ICS时间报错排查

问题分析与修复方案

你的错误主要出在键名匹配错误和字符串格式处理不当两个地方,具体修复步骤如下:

1. 修正键名拼写错误

你代码里写的是DSTART,但ICS文件中的字段是DTSTART(多了一个字母T),DTEND字段同理。这个拼写错误会导致你无法匹配到对应的字段值,最终$DSTART和$DTEND会返回$null,传递给ParseExact方法自然会触发格式错误。

2. 修正键名的引号转义逻辑

你用了\"这种HTML实体转义写法,但PowerShell中不需要这么处理。ICS里的字段名是DTSTART;TZID="W. Europe Standard Time",在PowerShell中用单引号包裹键名时,直接保留双引号即可,不需要额外转义。

修复后的代码

# 匹配DTSTART字段
$dstartEntry = $data.GetEnumerator() | Where-Object { $_.Name -eq 'DTSTART;TZID="W. Europe Standard Time"' }
if ($dstartEntry) {
    $DSTART = $dstartEntry.Value -replace "T", ""
    $DSTART = [datetime]::ParseExact($DSTART, "yyyyMMddHHmmss", $null)
} else {
    Write-Warning "未找到DTSTART字段"
}

# 匹配DTEND字段
$dtendEntry = $data.GetEnumerator() | Where-Object { $_.Name -eq 'DTEND;TZID="W. Europe Standard Time"' }
if ($dtendEntry) {
    $DTEND = $dtendEntry.Value -replace "T", ""
    $DTEND = [datetime]::ParseExact($DTEND, "yyyyMMddHHmmss", $null)
} else {
    Write-Warning "未找到DTEND字段"
}

额外优化建议

如果你的ICS文件可能包含不同时区,或者不想硬编码时区名称,可以用通配符匹配字段名,避免因时区变化导致匹配失败:

$dstartEntry = $data.GetEnumerator() | Where-Object { $_.Name -like 'DTSTART;TZID=*' }
$dtendEntry = $data.GetEnumerator() | Where-Object { $_.Name -like 'DTEND;TZID=*' }

内容的提问来源于stack exchange,提问作者AleXSR700

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:45:18