【发布时间】:2011-07-13 11:57:43
【问题描述】:
我想打印以毫秒为单位的持续时间,并根据其大小使用不同的格式规范:
case (1) "H:mm" if duration < 10 hours
case (2) "HH:mm" if duration < 24 hours
case (3) "#d HH:mm" else (duration >= 24 hours)
这意味着持续时间低于 10 小时时只有 1 小时字段数字,
但如果有前导日字段,则为 2 小时字段数字!
例子:
case (1) "0:45" means 45 minutes,
"1:23" means 1 hour and 23 minutes,
case (2) "12:05" means 12 hours and 5 minutes and
case (3) "1d 05:09" means 1 day, 5 hours and 9 minutes
(= 29 hours and 9 minutes).
我试过了
object JodaTest {
import org.joda.time._
private val pdf = {
import format._
val pfb = new PeriodFormatterBuilder()
.appendDays.appendSeparator("d ")
.printZeroAlways
.minimumPrintedDigits(2).appendHours.appendSeparator(":")
.appendMinutes
new PeriodFormatter(pfb.toPrinter, null)
}
def durstr(duration: Long): String =
pdf.print((new Period(duration)).normalizedStandard)
}
导致
2700000 => "00:45" but should be "0:45"
4980000 => "01:23" but should be "1:23"
43500000 => "12:05"
104940000 => "1d 05:09"
但我不知道如何在情况 (1) 中省略两位数日表示的前导零 但同时在具有相同 PeriodFormat 的情况下 (3) 强制打印它。
是否可以使用单个 org.joda.time.format.PeriodFormatter 来做到这一点?
【问题讨论】:
-
一开始不是
minimumPrintedDigits(1),在几分钟工作之前不是minimumPrintedDigits(2)吗? -
@Daniel 认为 minimumPrintedDigits(1) 是默认值(可以省略),但我已经尝试过,它在前两种情况下工作正常,但在情况 (3) 中它留给@987654328 @ 而需要
104940000 => "1d 05:09"。 - P.S.: ...我的输入键有问题;-) -
啊,我明白了……嗯,它几乎做到了。 :-)
-
@Daniel 感谢您的评论,我在答案中也发现了案例 (3) 中的一个错误,并按照您的建议对测试套件进行了修改并通过插入
.minimumPrintedDigits(2).appendMinutes来修复它。
标签: java scala formatting jodatime duration