2015-12-23 9 views
4

Я пытаюсь изучить новый Date & Time API. Мой код работает, за исключением последней строки:Duration.ofDays генерирует UnsupportedTemporalTypeException

LocalDate current=LocalDate.now(); 
System.out.println(current); 

LocalDate personaldate=LocalDate.of(2011,Month.AUGUST, 15); 
System.out.println(personaldate); 

LocalDate afterten=current.plus(Period.ofDays(10)); 
System.out.println(afterten); 

// error occurs here   
System.out.println(afterten.plus(Duration.ofDays(3))); 

Когда я пытаюсь добавить Duration в несколько дней, он генерирует ошибку. Может ли кто-нибудь помочь мне понять, почему?

Ошибка:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Seconds                        
     at java.time.LocalDate.plus(LocalDate.java:1241)                                    
     at java.time.LocalDate.plus(LocalDate.java:137)                                    
     at java.time.Duration.addTo(Duration.java:1070)                                    
     at java.time.LocalDate.plus(LocalDate.java:1143)                                    
     at TestClass.main(TestClass.java:15)  

ответ

9

длительность измеряет количество времени, используя основанный на время значения (секунды, наносекунды). Период использует даты (годы, месяцы, дни). здесь ссылка

https://docs.oracle.com/javase/tutorial/datetime/iso/period.html

такой же, как и в JodaTime

+1

И что это значит для их коды? –

+0

Продолжительность пытается добавить наносекунды к LocalDate, что неверно. Но период добавляет дней. Речь идет о внедрении классов Period и Duraion. –

+1

Отредактируйте свой ответ и добавьте это, подробно. –

1

Хотя принятый ответ совершенно правильно, когда я прибыл на этот вопрос, я искал простое решение моей проблемы.

Я нашел, что использование Period не позволило мне подсчитать количество дней между двумя моими объектами LocalDate. (Скажите, сколько лет, месяцев и дней между ними да, но не только тогда количество дней.)

Однако для получения результата, который я получил, было так же просто, как добавить метод LocalDate «atStartOfDay» в каждый из моих объектов.

Так что мой erronious код:

long daysUntilExpiry = Duration.between(LocalDate.now(), training.getExpiryDate()).toDays(); 

просто доводят до:

long daysUntilExpiry = Duration.between(LocalDate.now().atStartOfDay(), training.getExpiryDate().atStartOfDay()).toDays(); 

Делать это сделать объекты в объекты LocalDateTime, которые могут быть использованы с Duration. Поскольку оба объекта имеют начало дня в качестве «временной» части, нет никакой разницы.

Надеюсь, это поможет кому-то еще.