如果我有一个符合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