Подтвердить что ты не робот

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
4b9b3361

Ответ 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.