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

Powershell格式的持续时间为小时和分钟,powershell,date-formatting,duration,Powershell,Date Formatting,Duration,我试图将TimeSpan的字符串输出格式化为$h Hours$m Minutes,以实现复数化。现在,我有下面的代码,它工作得很好;但是,当它遇到不到一小时的时间跨度时,它将显示为0$m分钟 我试图找出是否有其他人解决了这个问题,但我能找到的最接近的是zuallauz'in 不幸的是,时间跨度在Powershell中的行为似乎有所不同,它们将分别显示天和小时,这意味着25小时45分钟的时间跨度将存储为: New-TimeSpan -Hours 25 -Minutes 45 Days

我试图将TimeSpan的字符串输出格式化为$h Hours$m Minutes,以实现复数化。现在,我有下面的代码,它工作得很好;但是,当它遇到不到一小时的时间跨度时,它将显示为0$m分钟

我试图找出是否有其他人解决了这个问题,但我能找到的最接近的是zuallauz'in

不幸的是,时间跨度在Powershell中的行为似乎有所不同,它们将分别显示天和小时,这意味着25小时45分钟的时间跨度将存储为:

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的帮助下,我能够创建以下函数:

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
}

谢谢大家的帮助

也许我遗漏了你的问题,但为什么不把天变成小时,然后检查小时是否大于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"}

也许我遗漏了一些关于你的问题,但是为什么不把天变成小时,然后检查小时是否大于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"}

要想让它看起来像你想要的那样漂亮有点烦人,但这会满足你的要求

$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

要想让它看起来像你想要的那样漂亮有点烦人,但这会满足你的要求

$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
只需在末尾添加一个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 = ""
}
只需在末尾添加一个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 = ""
}
样本输出:

25 hours 45 minutes
1 hour 45 minutes
1 hour 1 minute
0 hours 1 minute
样本输出:

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

嗯,这是一个很好的主意,将天转换成小时,然后再加上剩余的小时。你的答案中唯一缺少的是一个偶数小时的场景,但这应该足够简单,可以进行测试。我应该能够与此工作,并创建一个单独的多元化功能,将格式小时和分钟正确。完成后我会发布我完成的函数。谢谢没问题,如果这有助于解决您的问题,请将其标记为答案并投票表决。干杯。嗯,这是一个很好的主意,将天转换成小时,然后再加上剩余的小时。你的答案中唯一缺少的是一个偶数小时的场景,但这应该足够简单,可以进行测试。我应该能够与此工作,并创建一个单独的多元化功能,将格式小时和分钟正确。完成后我会发布我完成的函数。谢谢没问题,如果这有助于解决您的问题,请将其标记为答案并投票表决。干杯