Дата (System.currentTimeInMillis) не работает

Я хотел сегодняшнюю дату, используя объект даты, поэтому я передал System.currentTimeInMillis в конструкторе Date(), но он возвращает год как 121

Затем я использовал класс Calendar, и это решило мою проблему, но почему класс Date() вообще не работал?


person ADITYA DIXIT    schedule 20.05.2021    source источник
comment
Почему бы вам не прочитать Javadocs в первую очередь? год, представленный этой датой, минус 1900.   -  person Scary Wombat    schedule 20.05.2021
comment
new Date() дает вам текущее время, используя System.currentTimeMillis().   -  person Andy Turner    schedule 20.05.2021
comment
Почему бы вам не перейти на уже довольно старый новый API java.time? java.util.Date и связанные с ним классы, такие как Calendar, были заменены уже много лет.   -  person Thomas    schedule 20.05.2021


Ответы (1)


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