2016-01-27 3 views
1

Наш архитектор программного обеспечения принял решение удалить библиотеку времени Joda из зависимостей проекта и использовать возможности Java 8 раз. Я занимаюсь исследованием нашего проекта, и я пытаюсь найти все места, где мы используем Joda time lib, и определить, что мы используем (joda LocalDate, DateTime и т. Д.).
Я не являюсь экспертом библиотеки времени Joda, и я не эксперт Java 8 раз, поэтому у меня есть несколько вопросов:
В коде я видел много мест, как это:мигрировать из библиотеки времени Joda в Java time (Java 8)

DateTime jodaDateTime = new DateTime(); 
doSomething(jodaDateTime.toDate()); 

Я немного путают.

(Q1) Есть ли какой-либо смысл использовать Joda DateTime в данном конкретном случае? Я считаю, что мы можем использовать только классические java.util.Date и нам не нужно Joda:

java.util.Date date = new Date(); 
doSomething(date); 

Правильно?

Кроме того, я видел этот кусок кода:

org.joda.time.DateTime jodaDateTime = new DateTime(); 
org.joda.time.DateTime jodaDateTimeInPast = jodaDateTime.minusSeconds(60); 
doSomething(jodaDateTimeInPast.toDate()); 

Я думаю, что Java 8 раз API обеспечивает большую поддержку для расчета каких-либо дат в прошлом, так что я знаю, как заменить кусок код выше Java 8:

LocalDatetime java8DateTime = LocalDateTime.now(); 
LocaldateTime java8DateTimeInPast = java8DateTime.minusSeconds(60); 
Date java8Date = Date.from(java8DateTimeInPast.atZone(ZoneId.systemDefault()).toInstant()); 
doSomething(java8Date); 

(Q2) Я сделал это в правильном направлении? Я не уверен на 100%. Я просто нашел эту ссылку с таблицей: «Converting from Joda-Time to java.time» Есть я нашел информацию, что мне нужно использовать java.time.ZonedDateTime или java.time.OffsetDateTime классы, но не java.time.LocalDateTime, потому что LocalDateTime -

Та же концепция - дата и время без часовой пояс

Пожалуйста, подтвердите, что мой рефакторинга правильно (для Q1 и Q2).

ответ

4

Большинство вопросов о конверсии должно обрабатываться моим blog по теме.

Q1a: Нет смысла создавать объект Joda-Time только для возврата на java.util.Date. Тем не менее, метод должен probbaly принимать Instant или ZonedDateTime:

Instant instant = Instant.now(); 
doSomething(instant); // method changed to take Instant 

Обратите внимание, что Instant ближайший матч java.util.Date.

Q1b: Этот случай включает временную зону, поэтому следует использовать ZonedDateTime.

ZonedDateTime java8DateTime = ZonedDateTime.now(); // uses ZoneId.systemDefault() 
ZonedDateTime java8DateTimeInPast = java8DateTime.minusSeconds(60); 
doSomething(java8DateTimeInPast.toInstant()); 

Опять же, это предполагает, что doSomething изменяется принять Instant.

Ключом к правильному использованию java.time является представление о том, какой тип данных подходит для каждой части данных.

  • Только что дата? Затем используйте LocalDate
  • Просто время? Затем используйте LocalTime
  • Дата, время и часовой пояс? Затем используйте ZonedDateTime
  • Только временная метка без дополнительной информации? Затем используйте Instant
  • Сетевой формат даты и времени со смещением (не зоной)? Затем используйте OffsetDateTime.
+0

Вы писали: «Мгновенное действие - это самое близкое совпадение с java.util.Date», но, например: new Date(). ToString() возвращает: Thu Jan 28 18:26:27 EET 2016, но Instant.now(). toString() возвращает: 2016-01-28T16: 26: 27.210Z. Как вы можете видеть, Instant возвращает 16:26:27, и это UTC, Date возвращает 18:26:27 - EET – user471011

+2

'toString()' on 'java.util.Date' возвращает время в локальной часовой зоне , Но состояние объекта не выдерживает этого. Понимание этой разницы является ключом к пониманию 'java.util.Date'. – JodaStephen

2

Вы делаете это правильно для обоих случаев. Единственный комментарий, который я мог бы добавить, что java 8 time заменяет java.util.Date, чтобы вы могли подумать о замене своих методов doSomething (java.util.Date) на doSomething (java.time.temporal.TemporalAccessor). Однако java.util.Date еще не объявлен лишенным, так что вам не нужно. По моему опыту, пакет java 8 time - это очень гибкий и всеобъемлющий пакет. Я нашел некоторые забавные ошибки с Джодой, хотя Джода был хорошим пакетом для своего времени.

+3

'TemporalAccessor' не должен использоваться в большинстве прикладных программ. В общем, если вы используете его за пределами библиотеки нижнего уровня, вы делаете что-то неправильно. В этом случае это должно быть 'doSomething (Instant)' или 'doSomething (ZonedDateTime)' или аналогичное – JodaStephen

+0

@JodaStephen, все остальные точки верны? – user471011