Java SimpleDateFormat: час неправильный
Мне не нужна целая история, чтобы прояснить мой вопрос, поэтому я просто покажу код (что является простым примером). Как получится разница в моем результате?
код
long millis = 2305293L;
System.out.println(
millis + "ms = " +
(millis / 1000) + "s = " +
(millis / 1000 / 60) + "m");
System.out.println(
new SimpleDateFormat("HH:mm:ss").
format(
new Date(millis)
)
);
Выход
2305293ms = 2305s = 38m
01:38:25
Ответы
Ответ 1
Если вы находитесь в Лондоне или Париже, часовой пояс - GMT + 1 1 января 1970 года.
По причинам @ARC объясняет в комментариях, Великобритания использовала GMT + 1 или UTC + 1 с 18 февраля 1968 года по 31 октября 1971 года.
Возможно ли, чтобы я преобразовал длинный, не мешая интервалам времени?
Установите часовой пояс на GMT.
long millis = 2305293L;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sdf.format(new Date(millis)));
печатает
00:38:25.293
Ответ 2
Попробуйте следующее:
System.out.println(new java.util.Date (0));
вы увидите, что он начинается в 01:00:00, следовательно, разница в один час.
Ответ 3
Другие ответы были правильными и были хорошими, когда вопрос был задан в 2013 году. Сегодня мы больше не должны использовать ни Date
ни SimpleDateFormat
, поэтому я хотел бы показать вам несколько современных фрагментов кода. Правильный способ форматирования ваших (в данном случае) 2 305 293 миллисекунд зависит от того, что они представляют.
Форматирование количества миллисекунд с начала эпохи
Вам нужно решить, в каком часовом поясе вы хотите интерпретировать свою точку во времени. Например:
long millis = 2_305_293L;
DateTimeFormatter formatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(Locale.ENGLISH);
ZonedDateTime dateTime = Instant.ofEpochMilli(millis)
.atZone(ZoneId.of("America/Coral_Harbour"));
String formattedTime = dateTime.format(formatter);
System.out.println(formattedTime);
31 декабря 1969 года в 19:38:25 EST
Поскольку в эпоху Корал-Харбор находился со смещением UTC -05: 00, мы получаем время ближе к концу 1969 года. В дополнение к часовому поясу вы можете изменять язык в зависимости от локали и длину формата через стиль формата ( полный, длинный, средний, короткий). Если вы хотите ofLocalizedTime
время суток без даты, используйте ofLocalizedTime
вместо ofLocalizedDateTime
.
Форматирование миллисекунды дня
Предполагая, что ваши миллисекунды начинаются с 0:00 ("полуночи") в любом часовом поясе:
LocalTime time = LocalTime.MIN.with(ChronoField.MILLI_OF_DAY, millis);
System.out.println(time);
00: 38: 25,293
Если этот формат удовлетворительный, вам не нужен какой-либо явный форматер. Если нет, вы можете использовать DateTimeFormatter
.
Форматирование длительности, количества времени
Количество времени совершенно отличается от времени и обрабатывается как объект Duration
. Прямой поддержки его форматирования нет, но с Java 9 все не так сложно (если вы знаете, как):
Duration amountOfTime = Duration.ofMillis(millis);
String formattedTime = String.format("%02d:%02d:%02d",amountOfTime.toHours(),
amountOfTime.toMinutesPart(), amountOfTime.toSecondsPart());
System.out.println(formattedTime);
00:38:25
Ссылка на сайт
Учебное пособие по Oracle: Date Time, объясняющее, как использовать java.time.