web-dev-qa-db-ja.com

PowerShellで秒をhh:mm:ss、fff形式に変換します

時間を秒とミリ秒で表す文字列があります。 「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を使用したよりエレガントな方法があると確信しています。

13
nixda

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

29
andyb

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
_
10

1行変換:

[timespan]::fromseconds(354801857.86437).tostring()

戻り4106.12:04:17.8640000

1
Alban