Joda-Time:使用单个Formatter格式化多种格式

bin*_*ADa 5 java formatting scala duration jodatime

我想打印持续时间,以毫秒为单位,具有不同的格式规范,具体取决于其大小:

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)
Run Code Online (Sandbox Code Playgroud)

这意味着只有1小时的字段数字,持续时间低于10小时,
但有一个领先的日期字段时有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).
Run Code Online (Sandbox Code Playgroud)

我试过了

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)
}
Run Code Online (Sandbox Code Playgroud)

这导致

  2700000 => "00:45"     but should be "0:45"
  4980000 => "01:23"     but should be "1:23"
 43500000 => "12:05"
104940000 => "1d 05:09"
Run Code Online (Sandbox Code Playgroud)

但我不知道在情况(1)中如何省略两位数日表示的前导零,但同时强制在情况(3)中使用相同的PeriodFormat打印它.

是否有可能用一个org.joda.time.format.PeriodFormatter

Jod*_*hen 0

您可以实现PeriodPrinter接口以完全按照您的需要格式化周期,然后使用构建器来设置格式化程序。