2016-02-02 16 views
7

Nel java.time quadro di Java 8 e versioni successive, la classe Duration dice:Durata non supporta GIORNI contraria alla documentazione relativa alla classe

Questa classe modelli una quantità o quantità di tempo in termini di secondi e nanosecondi. È possibile accedervi utilizzando altre unità basate sulla durata, ad esempio minuti e ore. Inoltre, l'unità DAYS può essere utilizzata e viene considerata esattamente uguale a 24 ore, ignorando così gli effetti dell'ora legale.

Eppure, quando chiamo il metodo get e passo ChronoUnit.DAYS, viene generata un'eccezione.

LocalTime start = LocalTime.of (0 , 0 , 0); // First moment of the day. 
LocalTime stop = LocalTime.of (2 , 0 , 0); // 2 AM. 

Duration duration = Duration.between (start , stop); 
long days = duration.get (ChronoUnit.DAYS); 

Exception in thread java.time.temporal.UnsupportedTemporalTypeException "principale": Unità non supportata: Giorni

Perchè sono malinteso qualcosa, o uso improprio delle classi?

+0

Per quanto mi ricordo le uniche costanti '' ChronoUnit'' che funzionano in '' Duration.get (...) '' sono '' SECONDS'' e '' NANOS'', ma non ho mai scoperto perché. – f1sh

+1

@ f1sh Perché? È a causa dello stato interno di 'Durata' che contiene solo secondi e nanosecondi. Il metodo 'get (TemporalField)' è progettato per fornire una ** quantità ** parziale in base allo stato interno. Al contrario, 'toDays()' cerca di determinare l'importo ** intero ** convertito in giorni su base 1d = 24h. –

+0

Ho un errore di battitura nel mio commento precedente. Invece di dire 'get (TemporalField)' Volevo dire: get (TemporalUnit) '. –

risposta

2

Il metodo get(TemporalUnit) è purtroppo confuso e non destinate alla maggior parte degli utenti. Per capire perché, vedi this answer.

Java SE 9 includerà un set di metodi di accesso molto più ricco per Duration. Per ora, è possibile utilizzare toDays() per ottenere il numero totale di giorni.

Javadoc non è esattamente sbagliato, ma forse non perfettamente utile. La classe ha un certo supporto per giorni di 24 ore nel toDays(), ofDays(), plusDays() ecc. È solo che il metodo get(TemporalUnit) è chiamato in modo fuorviante (dovrebbe essere internalGet(TemporalUnit) o un nome simile).

6

Documentazione per get nella classe Durata.

Ottiene il valore dell'unità richiesta. Restituisce un valore per ciascuna delle due unità supportate, SECONDS e NANOS. Tutte le altre unità generano un'eccezione.

Tuttavia, la classe Duration ha un metodo chiamato toDays:

Ottiene il numero di giorni in questo periodo. Restituisce il numero totale di giorni della durata dividendo il numero di secondi di 86400. Ciò si basa sulla definizione standard di un giorno come 24 ore.

+0

Quindi la documentazione della classe è in errore e dovrei presentare una segnalazione di errore? –

+0

@BasilBourque Non penso che questo sia un bug, ma forse solo una documentazione un po 'confusa.La descrizione generale della classe fornisce solo un riassunto. Prenderò in considerazione le descrizioni dei metodi per superare il riepilogo generale. Non dice esplicitamente * dove * puoi usare 'DAYS', ma se leggi alcuni degli altri metodi (come' minus') puoi usare 'DAYS' in questi casi. – kunruh

+0

Ho speso la citazione del doc. Certo, mi sembra che dovremmo essere in grado di ottenere un numero di giorni. –