在PowerShell中,我如何将ISO 8601时间戳转换为使用逗号作为小数秒分隔符的本地datetime对象?<



如果我有一个符合ISO 8601标准的时间戳,使用逗号作为小数秒分隔符,例如:

$strTimestamp = '2021-08-31T23:12:11,5-05:00'

(即。, 2019-08-31 23:12:11和0.5秒,UTC-5偏移)

如何将其转换为本机PowerShell日期时间?我试过:

Get-Date -Date $strTimestamp

但是会抛出错误:

Get-Date: Cannot bind parameter 'Date'. Cannot convert value "2021-08-31T23:12:11,5-05:00" to type "System.DateTime". Error: "String '2021-08-31T23:12:11,5-05:00' was not recognized as a valid DateTime."

值得注意的是,使用句号而不是逗号的时间戳也可以正常工作:

(Get-Date -Date '2021-08-31T23:12:11.5-05:00') | Format-List

的回报:

DisplayHint : DateTime
Date        : 8/31/2021 12:00:00 AM
Day         : 31
DayOfWeek   : Tuesday
DayOfYear   : 243
Hour        : 23
Kind        : Local
Millisecond : 500
Minute      : 12
Month       : 8
Second      : 11
Ticks       : 637660483315000000
TimeOfDay   : 23:12:11.5000000
Year        : 2021
DateTime    : Tuesday, August 31, 2021 11:12:11 PM

由于逗号分隔符符合标准,理想的答案应该接受逗号、句号,或者根本不接受分隔符。

谢谢!

实事求是地说,用.替换,在你的输入字符串中确实是最简单的解决方案:

'2021-08-31T23:12:11,5-05:00', # comma
'2021-08-31T23:12:11.4-05:00', # period
'2021-08-31T23:12:11-05:00' |  # no fractional part
ForEach-Object {
[datetime] ($_ -replace ',', '.')
}

虽然,作为小数秒的十进制标记是ISO 8601标准的一部分,但正如您所述,[datetime](System.DateTime)类型的Parse()方法不识别它(它只识别.),而不考虑有效的文化-至少在。net 5/。net 6的预览版本中。

请注意,PowerShell的[datetime] '...'强制转换相当于调用
[datetime]::Parse('...', [cultureinfo]::InvariantCulture),因为PowerShell默认应用不变量文化(参见这个答案,了解PowerShell强制转换的一般概况)。

您可以使用自定义格式的[datetime]::ParseExact

$strTimestamp = '2021-08-31T23:12:11,5-05:00'
[datetime]::ParseExact($strTimestamp, "yyyy-MM-ddTHH:mm:ss','fzzz", $null)
01 September 2021 05:12:11

请注意,这将根据时区进行调整。

如果您想忽略时区,请使用[DateTimeOffset]及其DateTime属性

$strTimestamp = '2021-08-31T23:12:11,5-05:00'
[DateTimeOffset]::ParseExact($strTimestamp, "yyyy-MM-ddTHH:mm:ss','fzzz", $null).DateTime
31 August 2021 23:12:11

最新更新