Powershell格式的持续时间为小时和分钟
我试图将TimeSpan的字符串输出格式化为$h Hours$m Minutes,以实现复数化。现在,我有下面的代码,它工作得很好;但是,当它遇到不到一小时的时间跨度时,它将显示为0$m分钟 我试图找出是否有其他人解决了这个问题,但我能找到的最接近的是zuallauz'in 不幸的是,时间跨度在Powershell中的行为似乎有所不同,它们将分别显示天和小时,这意味着25小时45分钟的时间跨度将存储为: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
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
嗯,这是一个很好的主意,将天转换成小时,然后再加上剩余的小时。你的答案中唯一缺少的是一个偶数小时的场景,但这应该足够简单,可以进行测试。我应该能够与此工作,并创建一个单独的多元化功能,将格式小时和分钟正确。完成后我会发布我完成的函数。谢谢没问题,如果这有助于解决您的问题,请将其标记为答案并投票表决。干杯。嗯,这是一个很好的主意,将天转换成小时,然后再加上剩余的小时。你的答案中唯一缺少的是一个偶数小时的场景,但这应该足够简单,可以进行测试。我应该能够与此工作,并创建一个单独的多元化功能,将格式小时和分钟正确。完成后我会发布我完成的函数。谢谢没问题,如果这有助于解决您的问题,请将其标记为答案并投票表决。干杯