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,但由于向后兼容的原因,它可能无法修复。
脚本正在解析 *.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,但由于向后兼容的原因,它可能无法修复。