秒/ミリ秒を「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」を取得します。私はどこが間違っていますか?
時間帯。
長い値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
の期待される出力が得られます。
これを機能させました。動作するかどうか教えてください。一見シンプルに見えることをするための多くの行のようです。
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);
このタスクのために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時間まで処理できます。
Locale引数を持つSimpleDateFormatを取得する必要があります。
public static String getDateFromMillis(long millis) {
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
return formatter.format(new Date(millis));
}
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ドキュメントで説明されています。
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);