web-dev-qa-db-ja.com

この形式で秒を変換する方法 "HH:mm:ss"

秒/ミリ秒を「HH:mm:ss」という形式で変換したい(esampleの場合、5秒から00:00:05まで)。私はこの方法でこの形式を取得しようとしました:

int millis = 5000;
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
String time = df.format(millis);

そのようにして、「00:00:05」ではなく「01:00:05」を取得します。私はどこが間違っていますか?

27
Webman

時間帯。

長い値5000は、エポックの5秒後を意味します。大部分のタイムゾーンでは、エポックの5秒後は現地時間の午前0時5分ではありません。

Java 8アップデート

Java.time.LocalTimeは、Java.util.Dateで暗黙的に指定されているタイムゾーンや曜日を気にすることなく、壁時計の「時刻」の概念を処理します。 Java 8を使用でき、期間が常に1日未満になる場合、例の正しいバージョンは次のように簡単になります。

int millis = 5000;
int seconds = millis / 1000; // Maybe no need to divide if the input is in seconds
LocalTime timeOfDay = LocalTime.ofSecondOfDay(seconds);
String time = timeOfDay.toString();

(厳密に言えば、Java.time.Durationはあなたが望むもののより良いmodelです。時刻。ただし、hh:mm:ssにフォーマットするのは苦痛なので、24時間未満の値を常に処理する場合、TimeOfDayはこのフォーマットを無料で提供し、それ以外は同等です。)


Java 7以下)で立ち往生している場合、サンプルコードでGMTのタイムゾーンを明示的に指定すると、期待する出力が得られます。

Scala REPL問題を示すセッション、およびJava 7ソリューション、私のマシンで:

scala> val millis = 5000
millis: Int = 5000

scala> val df = new Java.text.SimpleDateFormat("HH:mm:ss")
df: Java.text.SimpleDateFormat = Java.text.SimpleDateFormat@8140d380

scala> df.format(millis)
res0: Java.lang.String = 01:00:05

scala> df.getTimeZone.getID
res1: Java.lang.String = GB

scala> df.getTimeZone.getOffset(millis)
res2: Int = 3600000

scala> df.setTimeZone(Java.util.TimeZone.getTimeZone("GMT"))

scala> df.format(millis)
res3: Java.lang.String = 00:00:05

したがって、デフォルトのタイムゾーンはGBであり、5000Lで示される時刻にGMTから1時間のオフセットがあります。タイムゾーンをGMTに設定すると、00:00:05の期待される出力が得られます。

21
Andrzej Doyle

これを機能させました。動作するかどうか教えてください。一見シンプルに見えることをするための多くの行のようです。

    int millis = 5000;
    TimeZone tz = TimeZone.getTimeZone("UTC");
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
    df.setTimeZone(tz);
    String time = df.format(new Date(millis));
    System.out.println(time);
12
B. Anderson

このタスクのためにJavaバージョンを必要とせず、不要なオブジェクトをインスタンス化しないシンプルなユーティリティ関数を作成しました。

/**
 * provides a String representation of the given time
 * @return {@code millis} in hh:mm:ss format
 */
public static final String formatTime(long millis) {
    long secs = millis / 1000;
    return String.format("%02d:%02d:%02d", secs / 3600, (secs % 3600) / 60, secs % 60);
}

ここにある他のソリューションとは異なり、これは最大100時間まで処理できます。

6
Xerus

Locale引数を持つSimpleDateFormatを取得する必要があります。

public static String getDateFromMillis(long millis) {
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
    return formatter.format(new Date(millis));
}
5
localhost

Java 9の答え:

    Duration dur = Duration.ofMillis(millis);
    System.out.println(String.format("%02d:%02d:%02d",
                       dur.toHours(), dur.toMinutesPart(), dur.toSecondsPart()));

(まだテストされていません)

toXxPartメソッドは Java 9 のAPIドキュメントで説明されています。

1
Ole V.V.
public class HHMMSS {

        final int UUR = 3600;
        final int MINUUT = 60;

    public void converteerTijd() {

        int uren, minuten, seconden, ingave;
        System.out.print("Geef een aantal seconden: ");
        ingave = Input.readInt();
        uren = ingave / UUR;
        minuten = (ingave - uren * UUR) / MINUUT;
        seconden = ingave - uren * UUR - minuten * MINUUT;
        String nU1 = (uren < 10) ? "0" : "";
        String nM1 = (minuten < 10) ? "0" : "";
        String nS1 = (seconden < 10) ? "0" : "";
        System.out.println(nU1 + uren + "-" + nM1 + minuten + "-" + nS1 + seconden);
1
maxim delaet