3

J2SE アプリケーションを作成します。このアプリケーションは、ミリ秒単位の 2 つの時間を、この 2 つの時間の間の間隔を表す文字列にフォーマットする必要があります。

long time1 = 1334331041677L; //Fri Apr 13 17:30:41 CEST 2012
long time2 = time1+1000*60*2; //Fri Apr 13 17:32:41 CEST 2012

「00:02:00」のようなものを取得したいと思います。これは簡単ですが、数秒から数年までの長い間隔をフォーマットする必要があるため、ライブラリで処理する必要があります。理想的には、このライブラリが国の慣習に従って間隔をフォーマットできる場合です (存在する場合)。

私は質問と回答を検索しました。解決策は、Apache CommonsのJodatimeまたはLangライブラリである可能性があります。これらのライブラリのうち、どのライブラリが私の要件をより適切に解決するかについて、いくつかの推奨事項を教えていただけますか? 前もって感謝します。

4

5 に答える 5

1

You can use standard Java Calendar for intervals up to one day (24 hours). It is not possible to use this trick for longer periods (days, years), though...

long start = System.currentTimeMillis();
/*
 * perform the measured activity here,
 * let's say it will take 2 minutes 5 seconds => 125 seconds => 125000ms
 */
Thread.sleep(125 * 1000);
long stop = System.currentTimeMillis();
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
c.setTimeInMillis(c.getTimeInMillis() + (stop - start));
DateFormat df = new SimpleDateFormat("HH:mm:ss.SSS");
System.out.println(df.format(c.getTime()));
于 2013-02-21T08:44:12.983 に答える
1

PeriodFormatJoda 時間おそらくあなたが望むものですが、1 日以上の値をどのようにフォーマットするかについては非常に慎重に考える必要があります月と年の長さは可変であることを覚えておいてください。最大の単位を 1 日として満足している場合は、おそらく物事を単純に保つことができます。

Periodまた、 (「月」などを含むことができる) とDuration固定ミリ秒数である aとの間の Joda Time の違いにも注意する必要があります。2つの間の正規化は、上記の問題に正確に関係しています:)基本的に、2つの瞬間間の経過時間の差に興味があるか、2つのローカル日付/時間間の「カレンダー」時間の差に興味があるかを解決する必要があります値。たとえば、特定のタイム ゾーンの特定の日付の午前 0 時から午前 2 時までは、1 時間、2 時間、または 3 時間の経過時間になる場合があります。

于 2012-04-13T15:50:12.910 に答える
0

私があなたを正しく理解していれば、次の (Joda Time を使用) が役に立ちます。

import org.joda.time.DateTime;
import org.joda.time.Period;

private String formatDuration(DateTime dt1, DateTime dt2) {
  Period period = new Period(dt1, dt2);
  String str = String.format("%s:%02d:%02d:%02d:%02d:%02d", 
    period.getYears(), period.getMonths(), period.getDays(), 
    period.getHours(), period.getMinutes(), period.getSeconds());
    // Ignoring milliseconds

  String[] tokens = str.split(":");
  boolean currNonZero = false, flag = false, isFirst = true;
  int ctr = 0, pos = 0;
  StringBuilder sb = new StringBuilder();
  for (String token : tokens) {
    pos++;
    int val = Integer.parseInt(token);
    currNonZero = (val > 0);
    if ((ctr < 3 && (flag || currNonZero)) || (ctr == 0 && pos > 3)) {
      if (isFirst) { isFirst = false; }
      else { sb.append(":"); }
      sb.append(token);
      flag = (++ctr < 3);
    }
  }

  return sb.toString();  
}

いくつかのテスト、

DateTime dt1 = new DateTime(2012, 1, 1, 8, 3, 5, 0);
DateTime dt2 = new DateTime(2012, 1, 2, 9, 5, 6, 0);
DateTime dt3 = new DateTime(2012, 2, 3, 11, 3, 5, 0);
DateTime dt4 = new DateTime(2012, 2, 3, 11, 3, 10, 0);
DateTime dt5 = new DateTime(2012, 2, 3, 11, 3, 10, 5); //5 millis away from dt4

formatDuration(dt1, dt2); // Returns "01:01:01"
formatDuration(dt1, dt3); // Returns "01:02:03"
formatDuration(dt3, dt4); // Returns "00:00:05"
formatDuration(dt4, dt5); // Returns "00:00:00"
于 2012-04-13T15:54:38.120 に答える
0

詳細な回答: https://stackoverflow.com/a/39600534/5330578

24 時間未満の経過時間の単純な書式設定。24 時間以上、コードは翌日の時間のみを表示し、経過日を時間に追加しません。

public static String formatElapsedTime(long milliseconds) {

    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

    return sdf.format(milliseconds);
}
于 2016-09-20T18:37:50.493 に答える
0

この回答によると、これは経過時間をフォーマットする最も効率的な方法です。

public static String combinationFormatter(final long millis) {
    long seconds = TimeUnit.MILLISECONDS.toSeconds(millis)
            - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis));
    long minutes = TimeUnit.MILLISECONDS.toMinutes(millis)
            - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis));
    long hours = TimeUnit.MILLISECONDS.toHours(millis);

    StringBuilder b = new StringBuilder();
    b.append(hours == 0 ? "00" : hours < 10 ? String.valueOf("0" + hours) : 
    String.valueOf(hours));
    b.append(":");
    b.append(minutes == 0 ? "00" : minutes < 10 ? String.valueOf("0" + minutes) : 
    String.valueOf(minutes));
        b.append(":");
    b.append(seconds == 0 ? "00" : seconds < 10 ? String.valueOf("0" + seconds) : 
    String.valueOf(seconds));
    return b.toString(); 
 }
于 2015-08-12T11:55:51.490 に答える