時間を秒とミリ秒で表す文字列があります。 「hh:mm:ss、fff」という形式の文字列に変換したい。
私の解決策には、10未満の時間が2桁ではなく1桁で表示されるという欠点があります。
PS> $secs = "7000.6789"
PS> $ts = [timespan]::fromseconds($s)
PS> $res = "$($ts.hours):$($ts.minutes):$($ts.seconds),$($ts.milliseconds)"
PS> $res
PS> 1:56:40,679
これを達成する正しい方法は何ですか? -f
とdatetimeを使用したよりエレガントな方法があると確信しています。
PowerShell 4.0の場合
$s = "7000.6789"
$ts = [timespan]::fromseconds($s)
("{0:hh\:mm\:ss\,fff}" -f $ts)
出力:01:56:40,679
PowerShell 2.0の場合
$s = "7000.6789"
$ts = [timespan]::fromseconds($s)
"{0:hh:mm:ss,fff}" -f ([datetime]$ts.Ticks)
出力:01:56:40,679
そして、逆に戻るには...
$text = "01:56:40,679"
$textReformat = $text -replace ",","."
$seconds = ([TimeSpan]::Parse($textReformat)).TotalSeconds
$seconds
出力:7000.679
TimeSpanオブジェクトでToString
メソッドを使用して、使用する形式を指定するだけです。 標準タイムスパン形式 のいずれかを使用するか、または カスタムタイムスパン形式 を使用します。たとえば、次のカスタム形式は必要な出力を提供します。
_$ts = [timespan]::fromseconds("7000.6789")
$ts.ToString("hh\:mm\:ss\,fff")
_
これは出力されます
_01:56:40,679
_
更新:PowerShell v2で機能する関数を提供するように更新
上記のソリューションは、PowerShell v4では正常に機能しますが、v2では機能しません(.NET Framework 4までTimeSpan.ToString(string)
メソッドが追加されなかったため)。
V2では、(質問で行っているように)文字列を手動で作成するか、通常のToString()
を実行して文字列を操作する必要があると思います。前者をお勧めします。これはそのためにうまく機能する関数です:
_function Format-TimeSpan
{
PARAM (
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[TimeSpan]$TimeSpan
)
#Current implementation doesn't handle days.
#By including the delimiters in the formatting string it's easier when we contatenate in the end
$hours = $TimeSpan.Hours.ToString("00")
$minutes = $TimeSpan.Minutes.ToString("\:00")
$seconds = $TimeSpan.Seconds.ToString("\:00")
$milliseconds = $TimeSpan.Milliseconds.ToString("\,000")
Write-Output ($hours + $minutes + $seconds + $milliseconds)
}
_
使用してそれをテストする
_$ts = [timespan]::fromseconds("7000.6789")
Format-TimeSpan -TimeSpan $ts
$ts | Format-TimeSpan
_
次の出力を生成します。
_01:56:40,679
01:56:40,679
_
1行変換:
[timespan]::fromseconds(354801857.86437).tostring()
戻り4106.12:04:17.8640000