Intereting Posts

Как преобразовать секунды в этом формате «HH: mm: ss»

Я хочу преобразовать второй / миллисекунды в этом формате «HH: mm: ss» (для эсэмплов, от 5 секунд до 00:00:05). Я попытался получить этот формат таким образом:

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

Таким образом, я получаю «01:00:05», а не «00:00:05». Где я ошибаюсь?

Часовые пояса.

Длительное значение 5000 означает 5 секунд после эпохи. Для большинства часовых поясов, через 5 секунд после эпохи не 5 секунд за полночь по местному времени.

Обновление Java 8 :

java.time.LocalTime будет обрабатывать идею настенных часов «время суток» без необходимости беспокоиться о часовых поясах и днях, скрытых в java.util.Date . Если вы можете использовать Java 8, и ваши длительности всегда будут меньше одного дня, то правильная версия вашего примера может быть такой простой, как:

 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 – лучшая модель того, что вы хотите, поскольку она представляет собой определенное количество секунд, а не время суток. Но боль в формате hh: mm: Ss, поэтому, если вы всегда имеете дело с суб-24hour значениями, 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 , который имеет смещение на 1 час от GMT в то время, обозначенное 5000L . Установка часового пояса для GMT gievs ожидается выход 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); 

Вы должны получить SimpleDateFormat с аргументом Locale.

 public static String getDateFromMillis(long millis) { SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); return formatter.format(new Date(millis)); } 
 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); 

Ответ Java 9:

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

(Еще не проверено)

Методы toXxPart описаны в документах API для Java 9 .