Разница между java.util.Date и java.time.LocalDate в java

Я хочу знать разницу между java.util.Date и java.time.LocalDate.

Я слышал, что java.time.LocalDate приносит время пользовательской среды, а не время сервера, но я хочу знать, правда ли это.

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


person limsrs    schedule 10.02.2020    source источник
comment
Как спросить На что вы пытались найти ответ? Почему вам не помогли результаты? Вы пробовали гугл? Вы пытались выполнить поиск в stackoverflow?   -  person Nicktar    schedule 10.02.2020
comment
приносит время пользовательской среды - что это? не серверное время — что это?   -  person Stephen C    schedule 10.02.2020
comment
java.time.LocalDate — это дата, указанная в календаре на стене. java.util.Date - это не дата, это мгновение, и фактически представляет миллисекундное смещение от эпохи Unix.   -  person Andy Turner    schedule 10.02.2020
comment
оба они не осведомлены о сервере или клиенте (максимум о времени машины, на которой они работают, если используется соответствующий конструктор или метод, использующий такое время)   -  person user85421    schedule 10.02.2020
comment
Между этими двумя все по-разному, за исключением того, что они оба имеют Date в имени, и оба имеют какое-то отношение к дате и/или времени. Для начала, Date — это момент времени, а LocalDate — это дата. Date плохо разработан и давно устарел, а LocalDate современен и рекомендуется для свиданий.   -  person Ole V.V.    schedule 10.02.2020
comment
Отвечает ли это на ваш вопрос? Java 8 Date API vs Calendar/Date/DateFormat   -  person Alperen Kantarcı    schedule 10.02.2020
comment
tl;dr… Используйте один. Избегай другого.   -  person Basil Bourque    schedule 11.02.2020


Ответы (3)


Избегайте java.util.Date

Основное отличие состоит в следующем: для нового кода вы должны использовать LocalDate для представления календарной даты, а не java.util.Date. Date плохо разработан и давно устарел, нет абсолютно никаких причин, по которым вы должны хотеть его использовать.

Время пользовательской среды по сравнению со временем сервера

LocalDate дает вам дату, на которую вы ее установили (тогда как установка Date на конкретную дату нетривиальна, но также возможна). То, что вы получите, пытаясь установить LocalDate (или Date) на «сегодня» или «сейчас», зависит от нескольких вещей:

  • Часы, из которых вы получаете время, опять же в зависимости от вашей настройки/архитектуры.
  • Часовой пояс

И Localdate.now(desriedTimeZone), и new Date() будут получать время с компьютера, на котором они работают. Поэтому, если у вас есть Java-клиент, работающий на компьютере пользователя, и пользователь вмешивается в часы на этом компьютере, они оба могут дать вам неверное время.

С другой стороны, если у клиента есть соединение с сервером, которым вы управляете, не должно быть сложно получить текущую дату и время с этого сервера (за исключением возникшей задержки, вероятно, намного меньше секунды).

person Ole V.V.    schedule 10.02.2020
comment
С другой стороны, если у клиента есть соединение с сервером, которым вы управляете... - Проблема в том, что если пользователь манипулирует часами, чтобы обойти просроченный лицензионный ключ, то они также может заблокировать доступ приложения к внешнему источнику времени или перенаправить соединение на фальшивый сервер времени. - person Stephen C; 10.02.2020

java.util.Date находится в Core java API начиная с JDK1.0, но java.time.LocalDate представлен в Java API в версии 1.8 версии java.

LocalDate представляет дату в формате ISO (гггг-ММ-дд) без времени. Его можно использовать для хранения таких дат, как дни рождения и выплаты зарплаты.

На самом деле этот новый Time-Date представлен в Java 1.8 для обеспечения неизменности и безопасности потоков. И предоставить широкий спектр служебных методов, которые поддерживают самые распространенные операции.

Вы можете обратиться к следующему для получения более подробной информации:

Разница между двумя датами в Java

Работа с датой и временем в Java 8

person Ajinkya    schedule 10.02.2020

На общий вопрос о различиях между java.util.Date и java.time.LocalDate я рекомендую вам прочитать соответствующий javadoc или статью о переходе на Java 8 time API. Различий много: их слишком много, чтобы перечислять.

(Общая рекомендация — не использовать java.util.Date в новом коде: относитесь к нему как к устаревшему классу.)

Что касается конкретного вопроса, который, я думаю, вы задаете о «манипулировании» часами, ОБА java.util.Date И java.time.LocalDate получают информацию о времени из системных часов на компьютере пользователя. Таким образом, если пользователь «манипулирует» системными часами, чтобы сообщить фиктивную информацию о времени, то оба этих класса будут сообщать эту фиктивную информацию.

В более общем смысле в библиотеке классов Java SE нет класса, который будет сообщать достоверную информацию, если пользователь манипулирует часами. (Даже если бы такой класс существовал, пользователь мог бы модифицировать соответствующую библиотеку Java, чтобы обойти это. И если вы вложили в свой код смекалку, пользователь мог бы обойти и это.)

Обратите внимание, что это не специфичная для Java проблема. Любое приложение, работающее на машине, управляемой ненадежным пользователем, может подвергнуться вмешательству... независимо от языка программирования. Если вы предоставляете пользователю свое программное обеспечение для запуска на его машине, вы уступаете ему контроль над тем, что он может с ним делать. (Если они будут достаточно стараться.)

Наконец, если проблема, которую вы пытаетесь решить, заключается в том, что локальные часы пользователя не синхронизированы с источниками времени в Интернете, на самом деле это не проблема для приложения. Пользователи (или их системные специалисты) должны решить эту проблему.

person Stephen C    schedule 10.02.2020