Android Formatter не дает правильное время

Поэтому у меня есть этот код в Android

            DateFormat formatter = new SimpleDateFormat("HH:mm", Locale.getDefault());
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(millisUntilFinished);
            textView.setText(formatter.format(calendar.getTime()));

Вот как я передаю значения в этот метод, где строки часов и минут, например, "8" и "30"

Calendar c = Calendar.getInstance();
            String s = ApplicationPreferences.getWakeUp(ActivityStage1.this);
            String[] separated = s.split("\\:");
            String hours = separated[0];
            String minutes = separated[1];
            c.add(Calendar.DAY_OF_MONTH, 1);
            c.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hours));
            c.set(Calendar.MINUTE, Integer.parseInt(minutes));
            c.set(Calendar.SECOND, 0);
            c.set(Calendar.MILLISECOND, 0);
            long timeUntilStageTwo = (c.getTimeInMillis() - System.currentTimeMillis());
            startStageTwoTimer(timeUntilStageTwo);

Таким образом, значение в long millisUntilFinished выглядит примерно как 58441666, что составляет около 16 часов и 20 минут, но по какой-то причине время, которое оно показывает в конце в текстовом представлении, составляет еще 3 часа, я даже пытался с разными локалями, переданными в SimpleDateFormat, и все тот же, почему это происходит?

1 ответ

Ваш Calendar c находится в вашем местном часовом поясе UTC+3, в то время как системные часы работают в UTC. Отсюда разница 3 часа.

Ты можешь использовать setTimeZone() установить явный часовой пояс в календаре, прежде чем вычислять его значение в миллисекундах.

Если вы предпочитаете делать вычисления самостоятельно, вы можете получить часовой пояс пользователя с TimeZone.getDefault() а затем использовать getOffset(time) чтобы получить смещение в миллисекундах в указанное время UTC.

Другие вопросы по тегам