2009-09-17 3 views
56

私はJoda-TimeライブラリをJavaで使用しています。私は、期間オブジェクトを "x日、x時間、x分"の形式の文字列に変換しようとすると、いくつかの困難を抱えています。文字列までの期間

これらの期間オブジェクトは、秒単位でXMLにシリアル化されてから再作成される秒数を追加することによって最初に作成されます。 getHours()などのメソッドを単純に使用すると、取得するのはゼロになり、の合計は秒でgetSecondsになります。

どのように日、時間など、それぞれのフィールドに秒を計算することができますか?

+1

関連:http://stackoverflow.com/q/10829870/11236 – ripper234

答えて

91

期間を正規化する必要があります。合計秒数で構成すると、期間が正規化されるからです。

編集 ripper234等により、それは日、分、秒の合計数にそれを打破します正常化 - TL;DR version追加:たとえばPeriodFormat.getDefault().print(period)

public static void main(String[] args) { 
    PeriodFormatter daysHoursMinutes = new PeriodFormatterBuilder() 
    .appendDays() 
    .appendSuffix(" day", " days") 
    .appendSeparator(" and ") 
    .appendMinutes() 
    .appendSuffix(" minute", " minutes") 
    .appendSeparator(" and ") 
    .appendSeconds() 
    .appendSuffix(" second", " seconds") 
    .toFormatter(); 

    Period period = new Period(72, 24, 12, 0); 

    System.out.println(daysHoursMinutes.print(period)); 
    System.out.println(daysHoursMinutes.print(period.normalizedStandard())); 
} 

印刷します:

24 minutes and 12 seconds
3 days and 24 minutes and 12 seconds

正規化されていない期間の出力は、時間数を無視するだけです(72時間から3日間に変換されませんでした)。それが理由です、あなたは時間が不足している

Period period = new Period(startDate, endDate); 
System.out.println(PeriodFormat.getDefault().print(period)) 
+0

o.O ...私はもっと冗長にすべきだったと思います。 – Jherico

+0

すばらしい答えをありがとう。 –

+1

-1これはローカライズするのが難しいため、私から – Trejkaz

12
Period period = new Period(); 
    // prints 00:00:00 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
    period = period.plusSeconds(60 * 60 * 12); 
    // prints 00:00:43200 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
    period = period.normalizedStandard(); 
    // prints 12:00:00 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
+2

この効果を得るには、フォーマット文字列をピリオドまたはそのフォーマッタに渡すことはできません。 – greenoldman

22

はまた、ほとんどの場合に適していますデフォルトのフォーマッタを使用することができます。数時間後に追加し、問題を解決しました。

+0

私は「ほとんどの場合」とは言いませんが、有用です。 – skaffman

+0

受け入れられる回答の一部である必要があります。 – ripper234

+0

あなたのユーザーが実際に派閥秒数を気にしていれば、それは非常に便利です。 –

2
PeriodFormatter daysHoursMinutes = new PeriodFormatterBuilder() 
    .appendDays() 
    **.appendSuffix(" day", " days") 
    .appendSeparator(" and ") 
    .appendMinutes() 
    .appendSuffix(" minute", " minutes")** 
    .appendSeparator(" and ") 
    .appendSeconds() 
    .appendSuffix(" second", " seconds") 
    .toFormatter();