PowerShell 中字符串到 DateTime 的转换出错(以前可以)

Error with String to DateTime conversion in PowerShell (it used to work before)

脚本正在解析 *.csv 文件中的值。 其中一个值是格式为 7/21/2018 7:07 AM UTC

的时间戳

这条线以前用过:

$DR.Item($property.Name) = (
 [System.DateTime](Get-Date($property.value -replace " UTC", ""))
).TolocalTime() -f "MM/d/yyyy HH:mm:ss"

它不再工作了。我收到以下错误:

Get-Date : Cannot bind parameter 'Date'. Cannot convert value "7/21/2018 7:07 AM" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."

你的命令失败表明当前文化[cultureinfo]::CurrentCulture)在执行时是其他而不是en-US(美式英语),在这种情况下 Get-Date 将无法识别 date/time 字符串,例如 "7/21/2018 7:07 AM[1]

解决方案是使用[datetime]直接转换,而不涉及Get-Date,因为[datetime]cast 总是使用invariant culture,也就是喜欢en-US 关于 date/time 格式的文化:

$DR.Item($property.Name) = ([datetime] ($property.value -replace ' UTC$')) -f "MM/d/yyyy HH:mm:ss"

警告:输出格式不需要调用 .ToLocalTime(),因为您收到的 [datetime] 实例的行为就像在本地一样默认时间,即使从技术上讲它与时区无关,如其 .Kind 属性 包含 Unspecified 所反映的那样。也就是说,您的输出将反映 UTC 日期和时间,但不会如此指明。
如果您真的想将输入的 UTC 时间戳转换为等效的本地时间,则需要做更多的工作:

$dtUtc = [datetime]::SpecifyKind(($property.value -replace ' UTC$'), 'Utc')
$DR.Item($property.Name) = $dtUtc.ToLocalTime() -f "MM/d/yyyy HH:mm:ss"

[1] PowerShell 通常使用 不变文化 当涉及到从字符串和到字符串类型转换时,但奇怪的是,不在将字符串作为 arguments 传递给 compiled cmdlets 时这样做,而不是 [advanced] functions (写在 PowerShell 中)。 这是一个 known problem,但由于向后兼容的原因,它可能无法修复。