2012-02-27 10 views
7

Ho bisogno di identificare la data che è 6 mesi completi fa. Ad esempio:Come identificare la data di 6 mesi completi fa

Feb-27, 2012(Today) - It is Feb and we don't count incomplete month, false 
Feb-01, 2012 - Still Feb so don't count too, false 
Jan-01, 2011 - Completed, false 
Dec-01, 2011 - Completed, false 
Nov-01, 2011 - Completed, false 
Oct-01, 2011 - Completed, false 
Sep-01, 2011 - Completed, false 
Aug-01, 2011 - Completed, false 
Jul-01, 2011 - Already pass 6 complete months, true 

Dovrebbe funzionare in qualsiasi data in futuro.

Ho pensato alla data corrente meno 30 * 6 = 180 giorni, ma non è accurata.

Deve essere accurato perché, ad esempio, se identifichiamo luglio 2011 è valido quindi gestiremo tutti i dati per quel mese.

Grazie.

+0

Hai provato qualcosa che probabilmente non ha funzionato? Hai provato il tempo di Joda? – Nishant

+0

Non conosco il tempo di joda quindi non sono sicuro che ci sia una classe utile per risolvere questo problema. – lamwaiman1988

+0

Il tempo di Joda è una libreria relativamente superiore per data e ora rispetto a Data di Java. Potresti vedere come ho risolto il problema per te. – Nishant

risposta

5

Se si potesse utilizzare JodaTime, qui è il codice per ± 6 mesi di calcolo:

import org.joda.time.DateTime; 
    import org.joda.time.Months; 
    .... 
    .... 
    DateTime now = new DateTime(); 
    DateTime then = new DateTime().withDate(2011, 8, 1); 
    if(Math.abs(Months.monthsBetween(now, then).getMonths()) > 6){ 
     System.out.println("6 mo apart!"); 
     //your logic goes here 
    } 
+0

Mi chiedo cosa stiano facendo "mesi tra". Ho usato oggi e 2011-8-01 per valutare e ha detto che sono a 6 mesi di distanza. Non è vero. Ci sono solo 5 mesi completi a parte. – lamwaiman1988

+0

Oh, ho fatto un errore. Funziona veramente. Perdonami per quello. +1. – lamwaiman1988

17

Proverei questa semplice logica per fare il lavoro.

Calendar cal = Calendar.getInstance(); //Get current date/month i.e 27 Feb, 2012 
cal.add(Calendar.MONTH, -6); //Go to date, 6 months ago 27 July, 2011 
cal.set(Calendar.DAY_OF_MONTH, 1); //set date, to make it 1 July, 2011 

Spero che questo aiuti.

+1

thumb up per la soluzione java standard senza jodas, ecc. – Michal

0

quanto ho capito, è necessario disporre di un programma di utilità che sarà determinare se una data variabile è 6 mesi prima della data di riferimento impostata. Dai un'occhiata al mio snippet di codice per questo problema. Viene semplicemente utilizzato java.util.Calendar, non è necessario utilizzare altre librerie.

import java.util.Calendar; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Calendar cal1 = Calendar.getInstance(); 
     cal1.set(2012, 2, 27); 
     Calendar cal2 = Calendar.getInstance(); 
     cal2.set(2011, 8, 1); 
     boolean valid = isSixMonthsAgo(cal1, cal2); 
     System.out.println(valid); 
    } 

    public static boolean isSixMonthsAgo(Calendar referenceDate, Calendar dateToBeTested) 
    { 
     int year1 = referenceDate.get(Calendar.YEAR); 
     int month1 = referenceDate.get(Calendar.MONTH); 

     int year2 = dateToBeTested.get(Calendar.YEAR); 
     int month2 = dateToBeTested.get(Calendar.MONTH); 

     if ((year1 * 12 + month1) - (year2 * 12 + month2) > 6) 
      return true; 
     return false; 
    } 
} 
1

YearMonth

La classe java.time.YearMonth integrato in Java rende questo compito semplice.

Ottieni l'anno corrente mese. Ciò richiede un fuso orario poiché in qualsiasi momento la data varia in base al fuso orario. Il primo/ultimo giorno del mese, il mese può variare in tutto il mondo per zona.

YearMonth ymCurrent = YearMonth.now(ZoneId.of("America/Montreal") ); 

Sappiamo che il mese corrente è incompleto per definizione. Quindi spostati al mese precedente.

YearMonth ymPrevious = ymCurrent.minusMonths(1) ; 

Spostare un ulteriore sei mesi prima, se lo si desidera.

YearMonth ymSixMonthsMore = ymPrevious.minusMonths(6); 

Che YearMonth oggetto stesso può essere utile nel codice. Puoi passare questi oggetti di questa classe attorno al tuo codice.

Se è necessario il primo giorno del mese, chiedere.

LocalDate ld = ymSixMonthsMore.atDay(1); 
Problemi correlati