Неправильный час по григорианскому календарю

Итак, я начал немного тестировать класс Java-GregorianCalendar и заметил странное поведение, возникающее при инициализации объекта с помощью миллисекунд. Что меня беспокоило, так это то, что хотя я установил миллисекунды на 0, время показывало 1 час.

Посмотрев немного на StackOverflow, я заметил, что Java иногда путают с летним и зимним временем. Итак, мой вопрос: если хотя в этом году смена времени уже произошла, и мы снова живем в зимнее время, такое странное поведение происходит от зимы и лета.

Вот код, с которым я тестировал:

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

public class TestCalendar {

    public static void main(String[] args) {
        GregorianCalendar c = new GregorianCalendar();
        c.setTimeInMillis(-3600000);
        System.out.println(c.getTimeInMillis());
        System.out.println(c.get(Calendar.HOUR));
        String format = "mm:ss";
        if (c.get(Calendar.HOUR_OF_DAY) > 0) format = "HH:mm:ss";
        System.out.println(new SimpleDateFormat(format).format(c.getTime()));
    }

}

Это дало мне результат

-3600000
0
0

Лучше всего было бы найти решение, не зависящее от вычитания -3600000, как будто на других компьютерах этой "ошибки" не существует, я не хочу иметь 23:00:00 :)

Обновлено:

Попробовав немного больше и благодаря обратной связи, я смог исправить свою небольшую проблему, просто добавив эту строку сразу после инициализации календаря:

c.setTimeZone(TimeZone.getTimeZone("GMT"));

Это не имеет ничего общего с летним и зимним временем, а связано с вашим часовым поясом. Очевидно, вы живете в часовом поясе, где 0:00:00 GMT соответствует 1:00:00 в вашем часовом поясе (например, CET - Central European Time).

Thomas Kläger 01.11.2018 22:11

Я здесь запутался. Что означает «Я установил миллисекунды на 0»? Где ты это делаешь? Вы имеете в виду -3600000, состоящее из -1 часа и нуля миллисекунд? Если да, то почему это каким-либо образом повлияет на часы работы Календаря? Помимо всего прочего, что вы на самом деле пытаетесь сделать? И поскольку похоже, что вы пытаетесь вычислить даты, вы смотрели пакет java.time?

VGR 01.11.2018 22:12

Я имею в виду, если я сделаю c.setTimeInMillis (0); Результат c.get (Calendar.HOUR) равен 1 На самом деле я не пытаюсь выполнять математику времени, но я хочу получить правильное форматирование времени в секундах. Так, например, у вас есть 20 секунд. Я хочу отобразить 00:20, так как мне это нужно для игры, которую я программирую.

Cedric 01.11.2018 22:13

Если вы хотите работать только со временем (без даты, без часового пояса), вам лучше использовать java.time.LocalTime - java.util.Calendar создан для работы с датами и часовыми поясами.

Thomas Kläger 01.11.2018 22:24

К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются наследие, вытесненными классами java.time, встроенными в Java 8 и новее. См. Руководство от Oracle.

Basil Bourque 01.11.2018 22:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
1 247
1

Ответы 1

Установка c.setTimeInMillis (0); устанавливает время на 1 января 1970 года в 00:00:00 GMT (1970-01-01 00:00:00 GMT), что называется эпохой

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#setTimeInMillis(long)

public void setTimeInMillis(long millis)

Sets this Calendar's current time from the given long value.

Parameters:
    millis - the new time in UTC milliseconds from the epoch.
See Also:
    setTime(Date), getTimeInMillis()

Если вы хотите установить время на полночь, я думаю, вы захотите это сделать.

    c.set(Calendar.HOUR_OF_DAY, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MILLISECOND, 0);

Я действительно знал какие, который я делал при инициализации, я просто не мог понять, почему я получил 1 час в качестве выхода ^^ В любом случае спасибо :)

Cedric 01.11.2018 22:26

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