Javaでミリ秒を「X分、X秒」に変換する方法


573

System.currentTimeMillis()ユーザーがプログラムで何かを開始したときに使用した時間を記録したい。彼が終了したらSystem.currentTimeMillis()start変数から電流を減算し、「XX時間、XX分、XX秒」または「XX分、XX秒」などの人間が読める形式を使用して経過時間を表示します。誰かに1時間かかる可能性は低いです。

これを行う最良の方法は何ですか?


5
1時間以上かかる場合でも、次のようなものを印刷できます。90分53秒。
Peter Lawrey

1
私の答えは、6年遅れていますが、私はそれが受け入れられたものより汎用的であると思う:stackoverflow.com/a/35082080/82609
セバスチャン・ローバー

回答:


1229

java.util.concurrent.TimeUnitクラスを使用します。

String.format("%d min, %d sec", 
    TimeUnit.MILLISECONDS.toMinutes(millis),
    TimeUnit.MILLISECONDS.toSeconds(millis) - 
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);

注:TimeUnitはJava 1.5仕様の一部ですが、toMinutesJava 1.6の時点で追加されました。

値0〜9の先行ゼロを追加するには、次のようにします。

String.format("%02d min, %02d sec", 
    TimeUnit.MILLISECONDS.toMinutes(millis),
    TimeUnit.MILLISECONDS.toSeconds(millis) - 
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);

TimeUnitまたはtoMinutesがサポートされていない場合(APIバージョン9より前のAndroidなど)、次の式を使用します。

int seconds = (int) (milliseconds / 1000) % 60 ;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours   = (int) ((milliseconds / (1000*60*60)) % 24);
//etc...

5
intか月=(int)((float)days / 30.4368499f); int年=(int)((float)days / 365.242199f);
Nathan Schwermann、2011年

7
分を差し引く代わりにmod 60を使用することをお勧めします。ただし、そのためには1分= 60秒であることを知っておく必要があります... =)
アレクサンダーソン

2
@AndreasDietrich SimpleDateFormatは、エポックからの日付のみを返すため、時差に対しては機能しません。
Muhammad Babar 2014年

5
int hours = (int) ((milliseconds / (1000*60*60)) % 24)これは機能しません!代わりに、このようにする必要がありますint hours = (int) (milliseconds / (1000*60*60)) ;
Muhammad Babar 2014年

5
誰かがビデオファイルの形式(h:mm:ss)を希望する場合:String.format("%01d:%02d:%02d", hours, minutes, seconds);
kazy

124

@siddhadevの答えに基づいて、ミリ秒をフォーマットされた文字列に変換する関数を書きました:

   /**
     * Convert a millisecond duration to a string format
     * 
     * @param millis A duration to convert to a string form
     * @return A string of the form "X Days Y Hours Z Minutes A Seconds".
     */
    public static String getDurationBreakdown(long millis) {
        if(millis < 0) {
            throw new IllegalArgumentException("Duration must be greater than zero!");
        }

        long days = TimeUnit.MILLISECONDS.toDays(millis);
        millis -= TimeUnit.DAYS.toMillis(days);
        long hours = TimeUnit.MILLISECONDS.toHours(millis);
        millis -= TimeUnit.HOURS.toMillis(hours);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
        millis -= TimeUnit.MINUTES.toMillis(minutes);
        long seconds = TimeUnit.MILLISECONDS.toSeconds(millis);

        StringBuilder sb = new StringBuilder(64);
        sb.append(days);
        sb.append(" Days ");
        sb.append(hours);
        sb.append(" Hours ");
        sb.append(minutes);
        sb.append(" Minutes ");
        sb.append(seconds);
        sb.append(" Seconds");

        return(sb.toString());
    }

2
あなたはこのような状況を避けるために、単一/複数のためにそこにチェックを実行する必要があります1 Days 1 Hours 1 Minutes 1 Seconds
ダニエル

7
私たちは、代わりに減算の弾性機能を使用できます long days = TimeUnit.MILLISECONDS.toDays(millis); long hours = TimeUnit.MILLISECONDS.toHours(millis) % 24; long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60; long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60; long milliseconds = millis % 1000; し、また、String.Formatの方法:return String.format("%d Days %d Hours %d Minutes %d Seconds %d Milliseconds", days, hours, minutes, seconds, milliseconds);
ホセTepedino

78
long time = 1536259;

return (new SimpleDateFormat("mm:ss:SSS")).format(new Date(time));

プリント:

25:36:259


1
私は上記のアプローチが何よりもその単純さのために最も好きです!時間と期間を扱っているため、通常はJodaを使用します。開始と終了の2つのDateTimeがある場合の例:Duration dur = new Duration(start, end); long millis = dur.getMillis();
TechTrip

1
Jodaフォーマッターを使用する2つの方法に注意する必要がありました。テーマの最初のバリエーション:DateTimeFormat.forPattern("mm:ss:SSS").print(new DateTime(time)); または、期間をJodaを使用して自動的に印刷できる期間に変換しますPeriodFormatter。ISO年表以外の場合、変換により精度が失われる可能性があります。変数によって表される期間を想定しますdurationPeriod period = duration.toPeriod().normalizedStandard(PeriodType.time()); PeriodFormat.getDefault().print(period)) 出力は素晴らしいです:上記の主な質問に答えて、1秒と581ミリ秒。
TechTrip 2012

2
ここで少し遅れます:)しかし、実際のタイムゾーンでない限り、ここにsimpleDateFormat.setTimezone(TimeZone.getTimeZone( "GMT"))を置く必要はありませんか?
OlleSöderström2013

@OlleSöderström確かにタイムゾーンに問題があります。しかし、それをGMTまたはUTCに設定すると、1時間より短いすべての期間で、時間の部分が0ではなく12になります。
Episodex

2
ここではタイムゾーンだけが問題ではありません...この答えは誤解を招きやすく、Java初心者を深刻に混乱させる可能性があります。余分な大括弧を無視しても、OPは持続時間(msで測定される2つの時点の差)を提示する方法を尋ねました。その期間を「時間」と呼び、それを1970年1月1日以降のオフセットとして扱うために、より小さなコンポーネントをフォーマットするだけです...間違っています。さらに、非常に同じアプローチがこの回答によって3年前にすでに提案されていました(タイムゾーンの問題の詳細については、コメントを参照してください)。
Amos M. Carpenter

36

えっと... 1秒は何ミリ秒?そして一分で?分割はそれほど難しくありません。

int seconds = (int) ((milliseconds / 1000) % 60);
int minutes = (int) ((milliseconds / 1000) / 60);

何時間、何日、何週間、何ヶ月、何年、何十年もそのように続けてください。


2
実際には、夏時間(23日または24時間の日数)またはうるう年が含まれる場合、結果が間違っている/直感的でない可能性があるため、1時間より長い時間これを実行することはお勧めできません。「Xは1年/月に発生します」と読んだ場合、同じ日時になると思います。
Michael Borgwardt

5
System.currentTimeMillis()はDSTの影響を受けないため、追加の時間や不足している時間によって混乱することはありません。2つの特定の日付の差を表示する必要がある場合は、指定された時間でDateオブジェクトを作成し、これら2つの日付の差を表示した方がよいでしょう。
ボンベ

1
月の長さが可変であるため、週を超えて、それは未定義です。したがって、実際には、特定の時間参照を基準にして計算する必要があります。
PhiLho 2009年

31

Java 8でjava.timeパッケージを使用する:

Instant start = Instant.now();
Thread.sleep(63553);
Instant end = Instant.now();
System.out.println(Duration.between(start, end));

出力はISO 8601期間形式ですPT1M3.553S(1分3.553秒)。



1
(ANDROID)APIレベル26が必要
Someone Somewhere

1
@SomeoneSomewhere APIレベル26のAndroidの場合、バックポートを使用します。AndroidプロジェクトでThreeTenABPを使用する方法を参照してください。
Ole VV

1
それは素晴らしいです:)ヘッズアップをありがとう!
誰かどこかに

27

私はそのために余分な依存関係を取り込んだりはしませんが(結局、分割はそれほど難しくありません)、とにかくCommons Langを使用している場合は、DurationFormatUtilsがあります。

使用例(ここから変更):

import org.apache.commons.lang3.time.DurationFormatUtils

public String getAge(long value) {
    long currentTime = System.currentTimeMillis();
    long age = currentTime - value;
    String ageString = DurationFormatUtils.formatDuration(age, "d") + "d";
    if ("0d".equals(ageString)) {
        ageString = DurationFormatUtils.formatDuration(age, "H") + "h";
        if ("0h".equals(ageString)) {
            ageString = DurationFormatUtils.formatDuration(age, "m") + "m";
            if ("0m".equals(ageString)) {
                ageString = DurationFormatUtils.formatDuration(age, "s") + "s";
                if ("0s".equals(ageString)) {
                    ageString = age + "ms";
                }
            }
        }
    }
    return ageString;
}   

例:

long lastTime = System.currentTimeMillis() - 2000;
System.out.println("Elapsed time: " + getAge(lastTime)); 

//Output: 2s

:2つのLocalDateTimeオブジェクトからミリ秒を取得するには、次を使用できます。

long age = ChronoUnit.MILLIS.between(initTime, LocalDateTime.now())

1
素晴らしい、この種のものを含む堅牢なライブラリがあるかどうかを私はただ自分に尋ねていました。
Lajcik、2011年

リンクは一般的にあまり役に立たないので、どのように使用できるかの例を追加しました。
lepe

26

手動で除算するか、SimpleDateFormat APIを使用します

long start = System.currentTimeMillis();
// do your work...
long elapsed = System.currentTimeMillis() - start;
DateFormat df = new SimpleDateFormat("HH 'hours', mm 'mins,' ss 'seconds'");
df.setTimeZone(TimeZone.getTimeZone("GMT+0"));
System.out.println(df.format(new Date(elapsed)));

Bombeによる編集:このアプローチは短い期間(つまり、1日未満)でのみ機能することがコメントで示されています。


ワオ。これは、タイムゾーンに依存する悪質なハックです。60分の倍数ではないタイムゾーンオフセットがあると、容赦なく中断します(世界中に30分のオフセットタイムゾーンがいくつかあります)。
Bombe

また、同じ理由で、書式文字列に時間を含めてGMT + 0になっていないとすぐに壊れます。
ボンベ

する?本当に?どこ?疑いなく、聞いたことがない-考慮すべきいくつかの新しい落とし穴;-)
Treb

はい。ウィキペディアで「タイムゾーンのリスト」を確認してください。たとえば、ネパールはGMT + 05:45です。
ボンベ

2
cadrian、今では1日未満の期間のみ機能します。時間数は常に0から23の間になります。
Bombe

21

HH:mm:ssのようにフォーマットしたい場合は、情報を追加するだけです。

0 <= HH <=無限

0 <= mm <60

0 <= ss <60

これを使って:

int h = (int) ((startTimeInMillis / 1000) / 3600);
int m = (int) (((startTimeInMillis / 1000) / 60) % 60);
int s = (int) ((startTimeInMillis / 1000) % 60);

私は今この問題を抱えていて、これを理解しました


1
ここでベストアンサー。なぜ誰もが物事をそんなに複雑にしたいのですか?これは簡単な数学です。
ランバート2016年

11

私は最良の方法は次のとおりだと思います:

String.format("%d min, %d sec", 
    TimeUnit.MILLISECONDS.toSeconds(length)/60,
    TimeUnit.MILLISECONDS.toSeconds(length) % 60 );

数分間はTimeUnit.MILLISECONDS.toMinutes(length)を使用できます
EminenT 2016

11

最短のソリューション:

これはおそらく、タイムゾーンも処理する最短のものです。

System.out.printf("%tT", millis-TimeZone.getDefault().getRawOffset());

たとえば、どの出力:

00:18:32

説明:

%tT24時間時計用にフォーマットされた時刻です%tH:%tM:%tS

%tTまた、入力としてlongを受け入れるため、を作成する必要はありませんDateprintf()はミリ秒で指定された時間を出力するだけですが、現在のタイムゾーンでは、現在のタイムゾーンの未処理のオフセットを差し引いて、0ミリ秒が0時間になり、現在のタイムゾーンの時間オフセット値ではなくなります。

注1:結果をとして必要な場合はString、次のように取得できます。

String t = String.format("%tT", millis-TimeZone.getDefault().getRawOffset());

注#2:これmillisは、日の部分が出力に含まれていないため、が1日未満の場合にのみ正しい結果になります。


これはすばらしいショートカットですが、使用すると期待した結果が得られません。だから私は持っています:long millis = 8398;そしてそれをString.format("%tT", millis)私の出力に渡すと19:00:08です。19はどこから来たのですか?
Nelda.techspiress 2017

1
@ Nelda.techspiressそれはあなたのタイムゾーンのオフセットです。あなたは減算する必要がTimeZone.getDefault().getRawOffset()答えに書かれたとおりに、それから:String.format("%tT", millis-TimeZone.getDefault().getRawOffset())
icza

それはそれを世話しました。明確にしていただきありがとうございます。
Nelda.techspiress 2017

8

ジョーダタイム

Joda-Timeの使用:

DateTime startTime = new DateTime();

// do something

DateTime endTime = new DateTime();
Duration duration = new Duration(startTime, endTime);
Period period = duration.toPeriod().normalizedStandard(PeriodType.time());
System.out.println(PeriodFormat.getDefault().print(period));

1
PeriodFormat最後の行ではその必要はありません。デフォルトではPeriod::toString、単に呼び出してISO 8601期間文字列を取得します。
バジルブルク2016年

8

@ brent-nashの寄与を再検討すると、減算の代わりに係数関数を使用し、結果の文字列にString.formatメソッドを使用できます。

  /**
   * Convert a millisecond duration to a string format
   * 
   * @param millis A duration to convert to a string form
   * @return A string of the form "X Days Y Hours Z Minutes A Seconds B Milliseconds".
   */
   public static String getDurationBreakdown(long millis) {
       if (millis < 0) {
          throw new IllegalArgumentException("Duration must be greater than zero!");
       }

       long days = TimeUnit.MILLISECONDS.toDays(millis);
       long hours = TimeUnit.MILLISECONDS.toHours(millis) % 24;
       long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60;
       long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60;
       long milliseconds = millis % 1000;

       return String.format("%d Days %d Hours %d Minutes %d Seconds %d Milliseconds",
                            days, hours, minutes, seconds, milliseconds);
   }

6

Android 9以下のAPI

(String.format("%d hr %d min, %d sec", millis/(1000*60*60), (millis%(1000*60*60))/(1000*60), ((millis%(1000*60*60))%(1000*60))/1000)) 

5

1時間未満の短い時間の場合は、次のようにします。

long millis = ...

System.out.printf("%1$TM:%1$TS", millis);
// or
String str = String.format("%1$TM:%1$TS", millis);

より長い間隔の場合:

private static final long HOUR = TimeUnit.HOURS.toMillis(1);
...
if (millis < HOUR) {
    System.out.printf("%1$TM:%1$TS%n", millis);
} else {
    System.out.printf("%d:%2$TM:%2$TS%n", millis / HOUR, millis % HOUR);
}

これは貴重なヒントです。JavaFormatter API(docs.oracle.com/javase/8/docs/api/java/util/Formatter.html)を使用すると、日付と時刻にそのような多くの可能性があります。また、次のようにしてelse条件の結果を得ることができます。System.out.printf( "%1 $ tH:%1 $ tM:%1 $ tS%n"、millis); またはSystem.out.printf( "%1 $ tT%n"、millis);
ホセテペディーノ2018

@JoseTepedinoしかし、あなたは0から23時間まで%tH しか表示しないことを知っていますか?つまり、たとえば、24時間はと表示され00、25時間は01...と表示されます。同じ%tT日が有効な場合、警告なしで破棄されます。もちろん、日数を表示することもできますが、これを書いたときの問題(2011年に遡ります)にはやりすぎです[:-)
user85421

なるほど...それは本当に1日(24時間)未満の時間でしか機能しません。ありがとうございました。
ホセテペディーノ2018

5

私の簡単な計算:

String millisecToTime(int millisec) {
    int sec = millisec/1000;
    int second = sec % 60;
    int minute = sec / 60;
    if (minute >= 60) {
        int hour = minute / 60;
        minute %= 60;
        return hour + ":" + (minute < 10 ? "0" + minute : minute) + ":" + (second < 10 ? "0" + second : second);
    }
    return minute + ":" + (second < 10 ? "0" + second : second);
}

幸せなコーディング:)


System.currentTimeMillis()がlong値を返すため、この関数にはlongがより適切であると思います。
アプロダン2018年

これは正しくありません。出力を確認しましたか?
Jorgesys

4

ブレントナッシュの回答に基づいた回答を以下に示します。

public static String getDurationBreakdown(long millis)
{
    String[] units = {" Days ", " Hours ", " Minutes ", " Seconds "};
    Long[] values = new Long[units.length];
    if(millis < 0)
    {
        throw new IllegalArgumentException("Duration must be greater than zero!");
    }

    values[0] = TimeUnit.MILLISECONDS.toDays(millis);
    millis -= TimeUnit.DAYS.toMillis(values[0]);
    values[1] = TimeUnit.MILLISECONDS.toHours(millis);
    millis -= TimeUnit.HOURS.toMillis(values[1]);
    values[2] = TimeUnit.MILLISECONDS.toMinutes(millis);
    millis -= TimeUnit.MINUTES.toMillis(values[2]);
    values[3] = TimeUnit.MILLISECONDS.toSeconds(millis);

    StringBuilder sb = new StringBuilder(64);
    boolean startPrinting = false;
    for(int i = 0; i < units.length; i++){
        if( !startPrinting && values[i] != 0)
            startPrinting = true;
        if(startPrinting){
            sb.append(values[i]);
            sb.append(units[i]);
        }
    }

    return(sb.toString());
}

4
    long startTime = System.currentTimeMillis();
    // do your work...
    long endTime=System.currentTimeMillis();
    long diff=endTime-startTime;       
    long hours=TimeUnit.MILLISECONDS.toHours(diff);
    diff=diff-(hours*60*60*1000);
    long min=TimeUnit.MILLISECONDS.toMinutes(diff);
    diff=diff-(min*60*1000);
    long seconds=TimeUnit.MILLISECONDS.toSeconds(diff);
    //hour, min and seconds variables contains the time elapsed on your work

3
6行目の式は間違っています。 diff=diff-(hours*60*1000);する必要がありますdiff=diff-(hours*60*60*1000);。編集を試みましたが、StackOverflowの迷惑な編集ポリシーにより、編集には十分な文字数ではないことが示されています。
quux00 2013

4

まず、System.currentTimeMillis()およびInstant.now()タイミングのために理想的ではありません。これらは両方とも、コンピュータが正確に知らない壁時計時間を報告します。これは、たとえばNTPデーモンがシステム時間を修正した場合、逆方向に移動するなど、不規則に動く可能性があります。単一のマシンでタイミングが発生する場合は、代わりにSystem.nanoTime()を使用する必要があります。

次に、Java 8以降では、java.time.Durationが期間を表すための最良の方法です。

long start = System.nanoTime();
// do things...
long end = System.nanoTime();
Duration duration = Duration.ofNanos(end - start);
System.out.println(duration); // Prints "PT18M19.511627776S"
System.out.printf("%d Hours %d Minutes %d Seconds%n",
        duration.toHours(), duration.toMinutes() % 60, duration.getSeconds() % 60);
// prints "0 Hours 18 Minutes 19 Seconds"

3

時差が1時間未満になることがわかっている場合は、次のコードを使用できます。

    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();

    c2.add(Calendar.MINUTE, 51);

    long diff = c2.getTimeInMillis() - c1.getTimeInMillis();

    c2.set(Calendar.MINUTE, 0);
    c2.set(Calendar.HOUR, 0);
    c2.set(Calendar.SECOND, 0);

    DateFormat df = new SimpleDateFormat("mm:ss");
    long diff1 = c2.getTimeInMillis() + diff;
    System.out.println(df.format(new Date(diff1)));

結果は51:00になります。


3

この答えは、上記のいくつかの答えに似ています。ただし、他の回答とは異なり、余分なコンマや空白が削除され、省略形が処理されるため、有益だと思います。

/**
 * Converts milliseconds to "x days, x hours, x mins, x secs"
 * 
 * @param millis
 *            The milliseconds
 * @param longFormat
 *            {@code true} to use "seconds" and "minutes" instead of "secs" and "mins"
 * @return A string representing how long in days/hours/minutes/seconds millis is.
 */
public static String millisToString(long millis, boolean longFormat) {
    if (millis < 1000) {
        return String.format("0 %s", longFormat ? "seconds" : "secs");
    }
    String[] units = {
            "day", "hour", longFormat ? "minute" : "min", longFormat ? "second" : "sec"
    };
    long[] times = new long[4];
    times[0] = TimeUnit.DAYS.convert(millis, TimeUnit.MILLISECONDS);
    millis -= TimeUnit.MILLISECONDS.convert(times[0], TimeUnit.DAYS);
    times[1] = TimeUnit.HOURS.convert(millis, TimeUnit.MILLISECONDS);
    millis -= TimeUnit.MILLISECONDS.convert(times[1], TimeUnit.HOURS);
    times[2] = TimeUnit.MINUTES.convert(millis, TimeUnit.MILLISECONDS);
    millis -= TimeUnit.MILLISECONDS.convert(times[2], TimeUnit.MINUTES);
    times[3] = TimeUnit.SECONDS.convert(millis, TimeUnit.MILLISECONDS);
    StringBuilder s = new StringBuilder();
    for (int i = 0; i < 4; i++) {
        if (times[i] > 0) {
            s.append(String.format("%d %s%s, ", times[i], units[i], times[i] == 1 ? "" : "s"));
        }
    }
    return s.toString().substring(0, s.length() - 2);
}

/**
 * Converts milliseconds to "x days, x hours, x mins, x secs"
 * 
 * @param millis
 *            The milliseconds
 * @return A string representing how long in days/hours/mins/secs millis is.
 */
public static String millisToString(long millis) {
    return millisToString(millis, false);
}

3

問題がある。ミリ秒が59999の場合、実際には1分ですが、59秒として計算され、999ミリ秒は失われます。

これは以前の回答に基づいて修正されたバージョンで、この損失を解決できます。

public static String formatTime(long millis) {
    long seconds = Math.round((double) millis / 1000);
    long hours = TimeUnit.SECONDS.toHours(seconds);
    if (hours > 0)
        seconds -= TimeUnit.HOURS.toSeconds(hours);
    long minutes = seconds > 0 ? TimeUnit.SECONDS.toMinutes(seconds) : 0;
    if (minutes > 0)
        seconds -= TimeUnit.MINUTES.toSeconds(minutes);
    return hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes, seconds) : String.format("%02d:%02d", minutes, seconds);
}

2

これはJava 9の方が簡単です。

    Duration elapsedTime = Duration.ofMillis(millisDiff );
    String humanReadableElapsedTime = String.format(
            "%d hours, %d mins, %d seconds",
            elapsedTime.toHours(),
            elapsedTime.toMinutesPart(),
            elapsedTime.toSecondsPart());

これは次のような文字列を生成します 0 hours, 39 mins, 9 seconds

フォーマットする前に秒単位に丸めたい場合:

    elapsedTime = elapsedTime.plusMillis(500).truncatedTo(ChronoUnit.SECONDS);

時間が0の場合、時間を除外するには:

    long hours = elapsedTime.toHours();
    String humanReadableElapsedTime;
    if (hours == 0) {
        humanReadableElapsedTime = String.format(
                "%d mins, %d seconds",
                elapsedTime.toMinutesPart(),
                elapsedTime.toSecondsPart());

    } else {
        humanReadableElapsedTime = String.format(
                "%d hours, %d mins, %d seconds",
                hours,
                elapsedTime.toMinutesPart(),
                elapsedTime.toSecondsPart());
    }

今、例えば 39 mins, 9 seconds

分と秒を先頭にゼロを付けて出力し、常に2桁にするため02には、関連するフォーマット指定子に挿入するだけです。

    String humanReadableElapsedTime = String.format(
            "%d hours, %02d mins, %02d seconds",
            elapsedTime.toHours(),
            elapsedTime.toMinutesPart(),
            elapsedTime.toSecondsPart());

今、私たちは例えば持つことができます0 hours, 39 mins, 09 seconds


先行する数値が0のときに時間/分/秒を削除するための書式設定?それはif else条件で達成可能であることを意味しますが、そのような文字列フォーマットの存在や何か近いものについてはどうですか?
ファリッド2018

1
いいえ、申し訳ありませんが、@ FARID、必要ですif- elseそこにあります。
Ole VV

1

正しい文字列(「1時間、3秒」、「3分」ではなく「0時間、0分、3秒」)の場合、次のコードを記述します。

int seconds = (int)(millis / 1000) % 60 ;
int minutes = (int)((millis / (1000*60)) % 60);
int hours = (int)((millis / (1000*60*60)) % 24);
int days = (int)((millis / (1000*60*60*24)) % 365);
int years = (int)(millis / 1000*60*60*24*365);

ArrayList<String> timeArray = new ArrayList<String>();

if(years > 0)   
    timeArray.add(String.valueOf(years)   + "y");

if(days > 0)    
    timeArray.add(String.valueOf(days) + "d");

if(hours>0)   
    timeArray.add(String.valueOf(hours) + "h");

if(minutes>0) 
    timeArray.add(String.valueOf(minutes) + "min");

if(seconds>0) 
    timeArray.add(String.valueOf(seconds) + "sec");

String time = "";
for (int i = 0; i < timeArray.size(); i++) 
{
    time = time + timeArray.get(i);
    if (i != timeArray.size() - 1)
        time = time + ", ";
}

if (time == "")
  time = "0 sec";

1

@MyKuLLSKIの回答を変更し、plurlizationサポートを追加しました。必要なかったので数秒かかりましたが、必要に応じて再度追加してください。

public static String intervalToHumanReadableTime(int intervalMins) {

    if(intervalMins <= 0) {
        return "0";
    } else {

        long intervalMs = intervalMins * 60 * 1000;

        long days = TimeUnit.MILLISECONDS.toDays(intervalMs);
        intervalMs -= TimeUnit.DAYS.toMillis(days);
        long hours = TimeUnit.MILLISECONDS.toHours(intervalMs);
        intervalMs -= TimeUnit.HOURS.toMillis(hours);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(intervalMs);

        StringBuilder sb = new StringBuilder(12);

        if (days >= 1) {
            sb.append(days).append(" day").append(pluralize(days)).append(", ");
        }

        if (hours >= 1) {
            sb.append(hours).append(" hour").append(pluralize(hours)).append(", ");
        }

        if (minutes >= 1) {
            sb.append(minutes).append(" minute").append(pluralize(minutes));
        } else {
            sb.delete(sb.length()-2, sb.length()-1);
        }

        return(sb.toString());          

    }

}

public static String pluralize(long val) {
    return (Math.round(val) > 1 ? "s" : "");
}

int intervalMins vs long millis
キケネット2017

1

私は別の答えでこれをカバーしましたが、あなたは行うことができます:

public static Map<TimeUnit,Long> computeDiff(Date date1, Date date2) {
    long diffInMillies = date2.getTime() - date1.getTime();
    List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class));
    Collections.reverse(units);
    Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();
    long milliesRest = diffInMillies;
    for ( TimeUnit unit : units ) {
        long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);
        long diffInMilliesForUnit = unit.toMillis(diff);
        milliesRest = milliesRest - diffInMilliesForUnit;
        result.put(unit,diff);
    }
    return result;
}

出力はのようなものMap:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}で、単位は順序付けられています。

ターゲットロケールに従ってこのデータを国際化する方法を理解するのはあなた次第です。


1

java.util.concurrent.TimeUnitを使用し、次の単純なメソッドを使用します。

private static long timeDiff(Date date, Date date2, TimeUnit unit) {
    long milliDiff=date2.getTime()-date.getTime();
    long unitDiff = unit.convert(milliDiff, TimeUnit.MILLISECONDS);
    return unitDiff; 
}

例えば:

SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd HH:mm:ss");  
Date firstDate = sdf.parse("06/24/2017 04:30:00");
Date secondDate = sdf.parse("07/24/2017 05:00:15");
Date thirdDate = sdf.parse("06/24/2017 06:00:15");

System.out.println("days difference: "+timeDiff(firstDate,secondDate,TimeUnit.DAYS));
System.out.println("hours difference: "+timeDiff(firstDate,thirdDate,TimeUnit.HOURS));
System.out.println("minutes difference: "+timeDiff(firstDate,thirdDate,TimeUnit.MINUTES));
System.out.println("seconds difference: "+timeDiff(firstDate,thirdDate,TimeUnit.SECONDS));

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.