2015-04-27 12 views
29

Ho bisogno del numero di giorni in un anno e volevo usare la nuova API di Java8.C'è un modo per avere una durata Java8 di un anno che tiene conto degli anni bisestili?

Tuttavia, non posso fare Duration.ofDays(365) perché non tiene conto degli anni bisestili. E Duration.of(1, ChronoUnit.YEARS) non vola a causa di java.time.temporal.UnsupportedTemporalTypeException: Unit must not have an estimated duration

Ho esaminato Periodo, ma non sembra utile per passare da anni a giorni.

Mi sento come se mi mancasse qualcosa qui? Potrei scrivere qualcosa per aggiungere un giorno se l'anno è un anno bisestile, ma sembra che dovrei essere in grado di gestire questo fuori dagli schemi.

+2

possibile duplicato di [Ottenere durata utilizzando la nuova API DateTime] (http://stackoverflow.com/questions/26454129/getting-duration-using-the-new-datetime-api) –

risposta

38

Come per la risposta in Getting Duration using the new dateTime API si dovrebbe utilizzare

Period p = Period.ofYears(1); 

E 'importante capire la differenza tra Duration (numero esatto di nanosecondi < 1 giorno) e Period (variabile> 1 giorno).

Duration non rappresentano i giorni bisestili, l'ora legale oi secondi bisestili, ad esempio, ed è destinato a durate inferiori a un giorno, al massimo alcuni giorni. Quindi è molto meglio se si è in grado di utilizzare Period invece.

Poiché diversi anni hanno un numero diverso di giorni, se si desidera trovare il numero di giorni in un anno, è necessario specificare l'anno di cui si sta parlando.

Se si desidera che il numero di giorni in un anno specifico, è possibile utilizzare

Year.of(year).length() 

Se si desidera che la data di un anno da oggi, è possibile utilizzare

LocalDate.now().plusYears(1) 

o

LocalDate.now().plus(Period.ofYears(1)) 

Se è necessario il numero di giorni tra due date, è possibile utilizzare

ChronoUnit.DAYS.between(start, end) 

Quindi, per trovare il numero di giorni alla data di un anno da oggi, è possibile utilizzare

LocalDate today = LocalDate.now(); 
long days = ChronoUnit.DAYS.between(today, today.plusYears(1)); 

Se si vuole vedere se un abbonamento di un anno è ancora valido, è possibile utilizzare

+2

Poiché un anno può avere una variabile numero di giorni, questo non è possibile. Per favore, dite, qual è il prossimo calcolo per il quale userete il numero di giorni, e forse possiamo trovare un altro modo? –

+0

Non c'è un prossimo calcolo. Pensa alla durata di un abbonamento o di un abbonamento. Se inizi oggi un abbonamento che dura un anno, in che giorno terminerà l'iscrizione? (e volevo usare la data/ora di java8) – user2272115

+5

@ user2272115: Devi specificare l'anno a cui sei interessato, dato che anni diversi hanno una lunghezza diversa. Quindi per "oggi", questo è 'Year.now(). Length()'. Se si desidera che la data di fine dell'iscrizione sia "LocalDate.now(). PlusYears (1)". –

9

Sembra chiaro che non si desidera una durata (= tra due date), ma la lunghezza dell'anno di una data specifica.

LocalDate dateLeap = LocalDate.of(2004, Month.MARCH, 1); 
System.out.println("leap year of " + dateLeap 
    + " has days: " + dateLeap.lengthOfYear()); 

anno bisestile del 2004-03-01 ha giorni: 366

Java 8 Data & tempo è sorprendente completo.


Se vuoi dire, nel 5 gennaio 2004 al 5 gennaio 2005 = e 2 Marzo 2004 al marzo 2rd 2005 = :

int lengthOfYear(LocalDate date) { 
    return date.getMonthValue() <= 2 
     ? date.lengthOfYear()    // Count Feb in this year 
     : date.plusYears(1).lengthOfYear(); // Count Feb in next year 
} 

Spiegazione: in pratica la lunghezza è di 365 Ma se la data è> = marzo, il mese di febbraio dell'anno successivo viene contato, altrimenti a febbraio di quest'anno.

Attenzione che plusYears(1) non cambierà GIORNO o MESE.

Inoltre, non vengono presi in considerazione né il secondo di salto o le ore/minuti del 29 febbraio.

+5

Inoltre puoi fare 'Year.of (2004) .length()'. –

+0

@ ChristofferHammarström la soluzione più semplice da tenere a mente. –

+0

Voglio una durata. La durata tra oggi e 1 anno da oggi, e voglio quella durata in numero di giorni. Ci sono alcuni modi in cui posso determinare quali anni hanno 366 giorni. – user2272115