Powershell格式持续时间为小时和分钟

时间:2018-04-04 20:24:36

标签: powershell date-formatting duration

我正在尝试将TimeSpan的字符串输出格式化为$h Hours $m Minutes,从而导致复数化。现在,我有以下代码,效果很好;但是,当遇到时间不到一小时的TimeSpan时,它会显示为0 $m minutes

Function FormatDuration ([TimeSpan]$Duration) {
    [string]$DurationStr = [math]::floor($Duration.TotalMinutes/60).ToString()
    if ([math]::floor($Duration.TotalMinutes/60) -eq 1) {
        $DurationStr = $DurationStr+" hour"
    } elseif ([math]::floor($Duration.TotalMinutes/60) -ne 0) {
        $DurationStr = $DurationStr+" hours"
    }
    if ($Duration.Minutes -eq 1){
        $DurationStr = $DurationStr+" "+$Duration.Minutes+" minute"
    # Does not display minutes if value is 0
    } elseif ($Duration.Minutes -ne 0) {
        $DurationStr = $DurationStr+" "+$Duration.Minutes+" minutes"
    }
    return $DurationStr
}

我试着找其他人是否解决了这个问题,但我能找到的最接近的是zuallauz' solution中的this C# thread

不幸的是,似乎TimeSpans在Powershell中的表现不同,它们将分别显示日期和小时,这意味着25小时45分钟的TimeSpan将存储为:

New-TimeSpan -Hours 25 -Minutes 45

Days              : 1
Hours             : 1
Minutes           : 45
Seconds           : 0
Milliseconds      : 0
Ticks             : 927000000000
TotalDays         : 1.07291666666667
TotalHours        : 25.75
TotalMinutes      : 1545
TotalSeconds      : 92700
TotalMilliseconds : 92700000

有人能指出我如何解决这个问题的正确方向吗?我的第一个想法是分开小时和分钟的处理,然后在最后连接它们而不是每个if-else语句。

编辑:

在Sambardo的solution的帮助下,我能够创建以下功能:

Function FormatDuration ([TimeSpan]$Duration) {
    $h = $Duration.Days * 24 + $Duration.Hours
    $m = $Duration.Minutes

    switch ($h) {
        0 {$HourStr=$null}
        1 {$HourStr="$h hour"}
        {$_ -ge 1} {$HourStr="$h hours"}
    }
    switch ($m) {
        0 {$MinuteStr=$null}
        1 {$MinuteStr="$m minute"}
        {$_ -ge 1} {$MinuteStr="$m minutes"}
    }
    if ($HourStr -gt 0 -and $MinuteStr -gt 0) {
        [String]$DurationStr=$HourStr+" "+$MinuteStr
    } else {
        $DurationStr=$HourStr+$MinuteStr
    }

    return $DurationStr
}

谢谢大家的帮助!

4 个答案:

答案 0 :(得分:1)

也许我错过了一些关于你问题的内容,但为什么不把几天变成几小时,然后检查小时是否大于0来调整你的字符串?

$TimeSpan = New-TimeSpan -Minutes 45
$h = $TimeSpan.Days * 24 + $TimeSpan.Hours
$m = $TimeSpan.Minutes
if($h -gt 0){"$h hours $m minutes"}
else{"$m minutes"}

答案 1 :(得分:1)

有点烦人,让它看起来很漂亮你想要它,但这将满足你的要求。

$Duration = New-TimeSpan -Hours 25 -Minutes 1
$TotalHours = $Duration.Hours + ( $Duration.Days * 24 )

$String = "$TotalHours Hour"
if ( $TotalHours -gt 1 )
{
    $String += 's'
}
$String += " $($Duration.Minutes) Minute"
if ( $Duration.Minutes -gt 1 )
{
    $String += 's'
}

return $String

返回值

25 Hours 1 Minute

答案 2 :(得分:1)

最后添加else条件。当楼层持续时间不是1且不等于零时,剩余楼层持续时间的唯一可能值为零。因此,在else中,您可以通过消隐字符串来管理零值。

if ([math]::floor($Duration.TotalMinutes/60) -eq 1) {
    $DurationStr = $DurationStr+" hour"
} elseif ([math]::floor($Duration.TotalMinutes/60) -ne 0) {
    $DurationStr = $DurationStr+" hours"
} else {
    $DurationStr = ""
}

答案 3 :(得分:1)

Function FormatDuration ([TimeSpan]$Duration) {
    $DurHours = [math]::floor($Duration.TotalHours)
    $DurMins  = $Duration.Minutes
    if ($DurHours-1){$PlHours='s'} else {$PlHours=''}
    if ($DurMins -1){$PlMins='s'}  else {$PlMins=''}
    return "{0} hour$($PlHours) {1} minute$($PlMins)" -f $DurHours,$DurMins
}

FormatDuration (New-TimeSpan -Hours 25 -Minutes 45)
FormatDuration (New-TimeSpan -Hours  1 -Minutes 45)
FormatDuration (New-TimeSpan -Hours  1 -Minutes  1)
FormatDuration (New-TimeSpan -Hours  0 -Minutes  1)

示例输出:

25 hours 45 minutes
1 hour 45 minutes
1 hour 1 minute
0 hours 1 minute