tl;dr
Используйте только классы java.time. Никогда не используйте устаревшие классы Date
/Calendar
.
java.time.LocalDate.now()
Избегайте устаревших классов даты и времени
Вы используете ужасные классы даты и времени, связанные с самыми ранними версиями Java. Эти классы были написаны людьми, которые не разбирались в обработке даты и времени и сделали очень плохой выбор дизайна.
Sun, Oracle и сообщество JCP несколько лет назад отказались от этих классов, единодушно приняв JSR 310. Я предлагаю вам также отказаться от них. Используйте только классы java.time для работы с датой и временем.
121 + 1900 = 2021
➥ Чтобы ответить на ваш конкретный вопрос: среди многих проблем этих устаревших классов заключается в том, что год представлен как 1900. Чтобы процитировать Javadoc:
Год y представлен целым числом y - 1900.
Таким образом, добавление 1900 к 121 году дает результат в 2021 году. Тайна разгадана. Но ничего, просто перейдите к использованию java.time.
java.время
Если вам нужна только дата, без времени суток и без часового пояса, используйте LocalDate
.
LocalDate today = LocalDate.now() ;
Лучше указать желаемый/ожидаемый часовой пояс, через который будет восприниматься текущая дата, а не неявно полагаться на текущий часовой пояс JVM по умолчанию. В любой момент дата варьируется по всему миру в зависимости от часового пояса: завтра в Токио, Япония, и еще вчера в Толедо, штат Огайо, США.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( z ) ;
Если вы хотите, чтобы текущий момент отображался в определенном часовом поясе, используйте ZonedDateTime
.
ZonedDateTime now = ZonedDateTime.now( z ) ;
Если вы хотите, чтобы текущий момент отображался в формате UTC, используйте Instant
.
Instant now = Instant.now() ;
О java.time
< Платформа em>java.time встроена в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.
Проект Joda-Time, теперь в режим обслуживания, советует перейти на java.time.
Вы можете обмениваться объектами java.time непосредственно с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах. Hibernate 5 и JPA 2.2 поддерживают java.time.
Где получить классы java.time?
person
Basil Bourque
schedule
20.05.2021
new Date()
дает вам текущее время, используяSystem.currentTimeMillis()
. - person Andy Turner   schedule 20.05.2021Date
. Этот класс плохо спроектирован и давно устарел. Вместо этого используйтеLocalDate
или соответствующий класс из java.time, современного API даты и времени Java а>. Даже если вы настаиваете на использованииDate
, держитесь подальше от его методаgetYear
. Этот и большинство других методов устарели в течение 24 лет, поскольку они ненадежно работают в разных часовых поясах. - person Ole V.V.   schedule 20.05.2021