Итак, я начал немного тестировать класс 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»? Где ты это делаешь? Вы имеете в виду -3600000, состоящее из -1 часа и нуля миллисекунд? Если да, то почему это каким-либо образом повлияет на часы работы Календаря? Помимо всего прочего, что вы на самом деле пытаетесь сделать? И поскольку похоже, что вы пытаетесь вычислить даты, вы смотрели пакет java.time?
Я имею в виду, если я сделаю c.setTimeInMillis (0); Результат c.get (Calendar.HOUR) равен 1 На самом деле я не пытаюсь выполнять математику времени, но я хочу получить правильное форматирование времени в секундах. Так, например, у вас есть 20 секунд. Я хочу отобразить 00:20, так как мне это нужно для игры, которую я программирую.
Если вы хотите работать только со временем (без даты, без часового пояса), вам лучше использовать java.time.LocalTime - java.util.Calendar создан для работы с датами и часовыми поясами.
К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются наследие, вытесненными классами java.time, встроенными в Java 8 и новее. См. Руководство от Oracle.




Установка 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 час в качестве выхода ^^ В любом случае спасибо :)
Это не имеет ничего общего с летним и зимним временем, а связано с вашим часовым поясом. Очевидно, вы живете в часовом поясе, где 0:00:00 GMT соответствует 1:00:00 в вашем часовом поясе (например, CET - Central European Time).