我正在尝试将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
}
谢谢大家的帮助!
答案 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