2012-02-27 6 views
7

Necesito identificar la fecha que es hace 6 meses completos. Por ejemplo:Cómo identificar la fecha de 6 meses completos

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 

Debería funcionar en cualquier fecha en el futuro.

Pensé en la fecha actual menos 30 * 6 = 180 días, pero no es precisa.

Tiene que ser preciso porque, por ejemplo, si identificamos julio de 2011 es válido entonces vamos a mantener todos los datos para ese mes.

Gracias.

+0

¿Probó algo que probablemente no funcionó? ¿Has probado la hora de Joda? – Nishant

+0

No sé sobre el tiempo joda, así que no estoy seguro de si hay alguna clase útil para resolver esto. – lamwaiman1988

+0

Joda time es una biblioteca relativamente superior para fecha-hora que la Fecha de Java. Podrías ver cómo he resuelto el problema por ti. – Nishant

Respuesta

5

Si usted podría utilizar JodaTime, aquí es el código para el cálculo ± 6 meses:

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

Me pregunto qué están haciendo "monthsBetween". Usé hoy y 2011-8-01 para evaluar y dijo que tienen 6 meses de diferencia. No es cierto. Solo hay 5 meses completos de diferencia. – lamwaiman1988

+0

Oh, cometí un error. Realmente funciona. Lo siento por eso. +1. – lamwaiman1988

17

Intentaré esta simple lógica para hacer el trabajo.

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 

Espero que esto ayude.

+1

pulgar hacia arriba para la solución java estándar sin jodas, etc. – Michal

0

lo que tengo entendido, es necesario tener una utilidad que se determine si una fecha variable es 6 meses antes de la fecha de referencia que establecerá. Eche un vistazo a mi fragmento de código para este problema. Simplemente usa java.util.Calendar, no tiene que usar otras bibliotecas.

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 clase java.time.YearMonth incorporado en Java hace que esta tarea simple.

Obtenga el año-mes actual. Esto requiere un huso horario ya que en cualquier momento dado la fecha varía alrededor del mundo por zona. El primer/último día del mes, el mes puede variar alrededor del mundo por zona.

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

Sabemos que el mes actual está incompleto por definición. Así que muévete al mes anterior.

YearMonth ymPrevious = ymCurrent.minusMonths(1) ; 

Si lo desea, muévase seis meses más.

YearMonth ymSixMonthsMore = ymPrevious.minusMonths(6); 

Eso YearMonth objeto en sí mismo puede ser útil en el código. Puede pasar estos objetos de esta clase alrededor de su código.

Si necesita el primer día de un mes, pregunte.

LocalDate ld = ymSixMonthsMore.atDay(1); 
Cuestiones relacionadas