用乔达时间周期显示“负”时间周期大小

问题描述:


我在项目中使用乔达时间(1.6.2),我正在做的一件事是获得预测时间和实际时间。有时候,这种差异是积极的,有时是消极的虽然适当的方法可能是使用Duration而不是Period,但使用PeriodFormatter来显示结果让我对PeriodFormatterBuilder类产生了疑问。作为一个例子:用乔达时间周期显示“负”时间周期大小

DateTime d1 = new DateTime(2011, 6, 17, 13, 13, 5, 0) ; 
DateTime d2 = new DateTime(2011, 6, 17, 10, 17, 3, 0) ; 

Period negativePeriod = new Period(d1, d2); 
Period positivePeriod = new Period(d2, d1); 

PeriodFormatter pf = new PeriodFormatterBuilder() 
    .minimumPrintedDigits(2) 
    .appendHours() 
    .appendSuffix(":") 
    .rejectSignedValues(true) // Does this do anything? 
    .appendMinutes() 
    .appendSuffix(":") 
    .appendSeconds() 
    .toFormatter(); 

System.out.printf("Negative Period: %s\n", pf.print(negativePeriod)); 
System.out.printf("Positive Period: %s\n", pf.print(positivePeriod)); 

的这个输出是:

Negative Period: -02:-56:-02 
Positive Period: 02:56:02 

我明白Period存储分别它的日期和时间的每个分量,但对我来说,.rejectSignedValues(true)方法的预期行为建设Formatter将只显示-签收只喜欢第一个元素:

Negative Period: -02:56:02 

难道我米是了解API,还是这是一个错误? JodaStephen?任何人?

为了展示我想要的东西并不难,但我只是对Builder方法感到好奇。

感谢,
-Manuel

+0

像负频率负的时期没有太大的意义在现实世界中。 JodaTime应该取差值的绝对值。 –

+0

感谢您的意见,彼得,但是,这不是1 /频率的时期。在乔达时代,“周期”是两个时间点之间的差异。当然,差异可以大于或小于零。 – Befloibent

+0

我可以称之为JodaTime支持的间隔。一段时期是经常发生的事情。 –

rejectSignedValues的Javadoc说Reject signed values when parsing the next and following appended fields,即。它只影响解析,而不是打印。

您的建议可能会作出有益的改进,但并不能保证所有组件都是正面的或全部为负面的。这也是一个有效期限:P-6D8H(正面和负面的混合)。这里

Duration dToFormat = duration; 
    if (duration.getStandardMinutes() < 0) { 
     dToFormat = duration.minus(duration).minus(duration); 
    } 

    ... 

    if (duration.getStandardMinutes() < 0) { 
       return "-"+pf.print(p); // leading minus 
      } 

和所有的代码在我的情况:

+0

啊哈。谢谢,史蒂芬。你知道,我在Javadoc中读到过,但显然没有注册。 RTFMC(小心)。我只是使用'持续时间'来区别(这正是我真正想要的),获得'standardSeconds',检查符号,从abs(持续时间)中创建一个'Period'并且构建基于符号的'PeriodFormatter'。除非有更好的方法来格式化'持续时间'?再次感谢并保持伟大的工作。我很好奇你如何从两个DateTime创建一个'P-6D8H'(+/-混合)时期,我只能管理一个'P6D8H'和一个'P-6D-8H'。但是,会继续工作。 – Befloibent

+0

也许那么一个合适的约定可能是:默认情况下,一个符号被带到下一个字段,直到明确颠倒。即“P-3D2H”意味着“过去三天两小时”,而“P-3D + 2H”意味着“过去三天后两小时”。我当然不寒而栗... –

我解决负这样

public static String durationToHHHmmFormat(Duration duration, String separator){ 
     if (duration == null) { 
      return null; 
     } 

     Duration dToFormat = duration; 
     if (duration.getStandardMinutes() < 0) { 
      dToFormat = duration.minus(duration).minus(duration); 
     } 

     Period p = dToFormat.toPeriod(); 
     PeriodFormatter pf = new PeriodFormatterBuilder() 
      .printZeroAlways() 
      .minimumPrintedDigits(2) // gives the '01' 
      .appendHours() 
      .appendSeparator(separator) 
      .appendMinutes() 
      .toFormatter(); 

     if (duration.getStandardMinutes() < 0) { 
      return "-"+pf.print(p); // leading minus 
     } 
     return pf.print(p); 
    }