С чем связана разница результатов в IDEA и на Stepik-е

На вход подается количество секунд с начала дня. На выходе нужно отобразить эти секунды в часах. В IDEA и на сайте выдаются разные результаты. С чем связана эта разница?

Результат на Stepik

Результат в IDEA


Ответы (1 шт):

Автор решения: Adm123

Ну, использование календаря для этой задачи - не самая лучшая идея. Не будем на это отвлекаться, т.к. задача, видимо, просто в демонстрации работы класса.

А дело тут вот в чем. Устанавливая в календарь миллисекунды, мы устанавливаем абсолютное время от начала Unix-эпохи. А в методе getTime() календарь отдает нам java.util.Date. А этот класс использует локаль для определения TimeZone, т.е. получаем мы время с учетом нашего часового пояса. То бишь - сколько было времени в нашем городе, когда от начала Unix-эпохи прошло заданное кол-во миллисекунд.

Что касается решения этой задачи, то оно возможно, хотя - повторюсь - это не есть хороший подход. Для этого нужно при получении даты из календаря учесть нашу временнУю зону.

Для иллюстрации сказанного запустите код и посмотрите на вывод.

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Main {

    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        Calendar calendar = Calendar.getInstance();
        long offset = calendar.getTimeZone().getOffset(calendar.getTimeInMillis());
        calendar.setTimeInMillis(3602 * 1000);

        System.out.println(calendar.getTimeInMillis());
        System.out.println(calendar.getTime());
        System.out.println(sdf.format(calendar.getTimeInMillis()));
        System.out.println(sdf.format(calendar.getTimeInMillis() - offset));
    }

}

P.S. Спасибо за вопрос! Интересная и неочевидная вещь.

→ Ссылка