powershell 将变化的时间戳转换为统一格式

m1m5dgzv  于 2023-01-26  发布在  Shell
关注(0)|答案(1)|浏览(204)

我正在尝试使用外部程序将脚本中的时间戳转换为毫秒。外部程序以尽可能短的格式输出时间示例外部程序可以输出以下任何格式:

"1:33.823" #1min:33 seconds.823 - shortest
"11:33.823" #11min:33 seconds.823 - short
"1:11:33.823" #1 hour 11min:33 seconds.823 - long

我需要这个值以毫秒为单位进行转换。所以我尝试了[timestamp] $mystring,但它在第一种情况下抱怨格式。我想手动解析格式,例如

$format='h\:mm\:ss\.ff'
[timespan]::ParseExact($mystring,$format , $null)

但是这种方法的问题是,我必须预测外部程序的每种可能的输出格式,并手动实现所有情况(如果最短,则$format=m\:ss\.fff else if short then $format=...
或者,我可以拆分并定义字符串,从后面循环并手动定义TimeSpan对象的属性。
我的问题是:语言中是否提供了任何标准的(良好实践)转换方法,或者我的"快速和肮脏"解决方案是否常见?
谢谢

dldeef67

dldeef671#

如果你确保你的时间跨度字符串至少有 3:分隔的成分,你可以直接将它们强制转换为[timespan](在幕后,它委托给[timespan]::Parse($inputString, [cultureinfo]::InvariantCulture))[1]

@(
  "1:33.823" #1min:33 seconds.823 - shortest
  "11:33.823" #11min:33 seconds.823 - short
  "1:11:33.823" #1 hour 11min:33 seconds.823 - long
) | ForEach-Object {
  $colonCount = ($_ -replace '[^:]').Length
  [timespan] ('0:' * [math]::Max(0, (3 - $colonCount - 1)) + $_)
}

以上代码在转换之前将输入字符串转换为0:1:33.8230:11:33.8231:11:33.823,即根据需要预先添加0:组件。
[1]PowerShell在设计上尽可能使用 * 不变区域性 *-有关详细信息,请参阅this answer

相关问题