2015-12-01 13 views
21

Sto provando a controllare in Java 8 se una data è più vecchia di 10 anni e più nuova di 20 anni. Sto usando Date.before() E Date.after() e passando currentDate-10 anni e currentDate-20 anni come argomenti.Controllare se la data è più vecchia di 10 anni e più recente di 20 anni

Qualcuno può suggerire quale sarà il modo più pulito per ottenere una data di 10 anni e 20 anni in formato Data per passarla nei miei metodi before() e after()?

+0

Io non sono sicuro al 100% su questo (mai usato Data prima/dopo), ma hai provato a confronto con una data inizializzato ad oggi , quindi impostare altre due date rispetto a questo (10 anni e 20 anni prima), quindi utilizzare tali metodi? – Foleosy

+1

ecco una buona lettura: http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html – Stultuske

+1

http://stackoverflow.com/questions/883060/how-can-i- determinare-se-una-data-è-tra-due-date-in-java – Stefan

risposta

11

Utilizzando Calendar è possibile ottenere facilmente una data di 10 anni e una data di 20 anni dalla data corrente.

Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.YEAR, -10); 
Date d1 = calendar.getTime(); 
calendar.add(Calendar.YEAR, -10); 
Date d2 = calendar.getTime(); 

Come si utilizza Java 8 è possibile utilizzare anche LocalDate

LocalDate currentDate = LocalDate.now(); 
    Date d1 = Date.from(currentDate.minusYears(10).atStartOfDay(ZoneId.systemDefault()).toInstant()); 
    Date d2 = Date.from(currentDate.minusYears(20).atStartOfDay(ZoneId.systemDefault()).toInstant()); 

per il confronto è possibile utilizzare i date.after() e date.before() metodi come hai detto.

if(date.after(d1) && date.before(d2)){ //date is the Date instance that wants to be compared 
     //// 
    } 

I before() e after() metodi sono implementati in Calendar e LocalDate troppo. È possibile utilizzare tali metodi in tali istanze senza convertirsi in istanze java.util.Date.

+8

Sebbene funzioni in java 8, raccomanderei l'uso della nuova data e ora. – SpaceTrucker

+2

Se si utilizza un LocalDate, non è necessario ripristinare una data ... – assylias

+1

Ho pensato che OP desidera utilizzare i metodi Date.after() 'e' Date.before() ' –

28

È possibile utilizzare java.time.LocalDate per eseguire questa operazione. Esempio: Se avete bisogno di controllare se 01/01/2005 è tra quella durata, è possibile utilizzare

LocalDate date = LocalDate.of(2005, 1, 1); // Assign date to check 
if(date.isBefore(today.minusYears(10)) && date.isAfter(today.minusYears(20))) 
    //Do Something 
+2

Mi sono preso la libertà di creando una variabile separata per affrontare il problema sollevato da @SpaceTrucker. Sentiti libero di tornare indietro se lo desideri. Inoltre, nota che questa risposta ignora i problemi di * ora * e * fuso orario *. Probabilmente troncherei prima l'ora usando 'atStartOfDay', e la gestione del fuso orario dipenderà dal caso d'uso specifico. – jpmc26

4

Un'altra possibilità è quella di ottenere il conteggio anno tra la data di controllare e la data superiore. Se il numero di anni è maggiore di 0 e inferiore a 10, significa che la data da verificare è maggiore di 10 anni e più recente di 20 anni.

Questo codice determinerà una data nell'intervallo ]now - 20 years ; now - 10 years[:

public static void main(String[] args) { 
    LocalDate dateToCheck = LocalDate.now().minusYears(20).plusDays(1); 

    LocalDate upperYear = LocalDate.now().minusYears(10); 
    long yearCount = ChronoUnit.YEARS.between(dateToCheck, upperYear); 
    if (yearCount > 0 && yearCount < 10) { 
     System.out.println("date is older than 10 years and newer than 20 years"); 
    } 
} 
+2

Vorrei usare 'long l = LocalDate.now() fino a (dateToCheck, ChronoUnit.YEARS); if (l <=-10 && l> -20) 'se l'attività è" controllare se l'età è all'interno di tale intervallo ".Ma la tua risposta è ancora l'unica non fuorviata dallo stile XY della domanda che si concentra sull'uso di 'prima' e' dopo' invece del compito reale. Si noti che 'x.until (y, YEARS)' è lo stesso di 'YEARS.between (x, y)' ma quest'ultimo si delega al primo. – Holger

+1

@Holger C'è comunque un piccolo dettaglio, penso che questo verificherà l'intervallo '] ora - 20 anni; ora - 10 anni] '(notare il limite inclusivo per la parte superiore). Ma l'OP non ha detto se i limiti dovevano essere inclusi o meno. – Tunaki

+1

Bene, puoi scegliere gli operatori '>' o '> =' resp. '<' or '<=' come preferisci, ma non hai bisogno di istanze intermedie di 'LocalDate' ... – Holger

Problemi correlati