2011-06-17 111 views
3


我在項目中使用喬達時間(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支持的間隔。一段時期是經常發生的事情。 –

回答

1

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」意味着「過去三天後兩小時」。我當然不寒而慄... –

0

我解決負這樣

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); 
    }