2011-02-25 75 views
11

Tengo un método que usa la siguiente lógica para calcular la diferencia entre días.¿Cómo encontrar el número de días entre dos fechas en Java o Groovy?

long diff = milliseconds2 - milliseconds1; 
long diffDays = diff/(24 * 60 * 60 * 1000); 

pero lo que quiero para ex, 9th feb 2011 to 19th feb 2011 debe devolverme 11 días, independientemente de segundos o milisegundos consideración. ¿Cómo puedo conseguir esto?

+0

todo los días tienen 24 horas, depende de su aplicación si esta es una aproximación adecuada. – CurtainDog

Respuesta

32

Para la solución maravilloso que pidió que debería considerar el uso de este:

use(groovy.time.TimeCategory) { 
    def duration = date1 - date2 
    println "days: ${duration.days}, Hours: ${duration.hours}" 
} 

Es muy fácil de entender y muy legible. Pidió un ejemplo de cómo se puede usar esto en un método sencillo que calcula los días entre dos fechas. Así que aquí está tu ejemplo.

class Example { 

    public static void main(String[] args) { 
     def lastWeek = new Date() - 7; 
     def today = new Date() 

     println daysBetween(lastWeek, today) 
    } 

    static def daysBetween(def startDate, def endDate) { 
     use(groovy.time.TimeCategory) { 
      def duration = endDate - startDate 
      return duration.days 
     } 
    } 
} 

Si ejecuta este ejemplo, imprimirá 7. También puede mejorar este método utilizando before() y after() para habilitar las fechas invertidas.

+0

Hola gracias por su respuesta ... no entendí esto ... cómo puedo hacer esto como una función donde pasaré dos objetos de fecha y debería devolverme la diferencia entre días? – maaz

+0

Le agregué un ejemplo para la función, considere la mejora de su método 'daysBetween()' con la comprobación 'before()'. – codevour

+0

Muchas gracias por su respuesta ... – maaz

0

acaba de analizar sintácticamente 9th feb 2011 & 19th feb 2011 en fechas utilizando SimpleDateFormat y convertirlo a empezar & millis finales y aplicar el cálculo

2
GregorianCalendar cal1 = new GregorianCalendar(2011,2,9); 
    GregorianCalendar cal2 = new GregorianCalendar(2011,2,19); 
    long ms1 = cal1.getTime().getTime(); 
    long ms2 = cal2.getTime().getTime(); 
    long difMs = ms2-ms1; 
    long msPerDay = 1000*60*60*24; 

    double days = difMs/msPerDay; 
0

Esto supone tiempos están en UTC o GMT.

long day1 = milliseconds1/ (24 * 60 * 60 * 1000); 
long day2 = milliseconds2/ (24 * 60 * 60 * 1000); 
// the difference plus one to be inclusive of all days 
long intervalDays = day2 - day1 + 1; 
+0

entre el 9 de febrero de 2011 y el 9 de febrero de 2011, la diferencia debería ser el 1 9 de febrero de 2011, de 09:00 a 19 feb, 14:00 debería darme 11 días. – maaz

+0

Este método dará 11 días independientemente del tiempo. Incluso dará 11 para '9th feb 2011 23: 00' y' 19th feb 2011 01: 00' –

0

Prueba esto:

DateFormat format = DateFormat.getDateTimeInstance(); 
    Date completeDate=null; 
    Date postedDate=null; 

    try 
    { 
     completeDate = format.parse("18-May-09 11:30:57"); 
     postedDate = format.parse("11-May-09 10:46:37"); 
     long res = completeDate.getTime() - postedDate.getTime(); 

     System.out.println("postedDate: " + postedDate); 
     System.out.println("completeDate: " + completeDate); 
     System.out.println("result: " + res + '\n' + "minutes: " + (double) res/(60*1000) + '\n' 
      + "hours: " + (double) res/(60*60*1000) + '\n' + "days: " + (double) res/(24*60*60*1000)); 
    } 
    catch (ParseException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Si quieren días para ser un entero, entonces basta con retirar la fundición hasta el doble. HTH

12

Es una línea muy gastada, pero para fechas usa JodaTime.

Así es como calculate date intervals usando JodaTime.

Days days = Days.daysBetween(new DateTime(millis1), new DateTime(millis2)); 
int daysBetweenDates = days.getDays(); 
+0

Gracias por su respuesta – maaz

+1

Desde Java 8 también puede usar la API de tiempo del JDK. Consulte http://docs.oracle.com/javase/8/docs/api/index.html?java/time/package-summary.html. En su caso, podría usar 'Period.between (date1, date2)' – rudolfson

0
Date.metaClass.calculateDays = { Date offset = new Date() ->    
    Long result = null 
    Date date = delegate 
    use(groovy.time.TimeCategory) { 
     result = (offset - date).days as Long 
    }    
    result    
} 

ejemplo de uso:

def sdf = new java.text.SimpleDateFormat("yyyy.MM.dd") 

sdf.lenient = false 

Date date = sdf.parse("2015.10.02") 

println date.calculateDays() 

println date.calculateDays(sdf.parse("2015.11.02")) 
0

En maravilloso todo lo que necesita es:

date2 - date1 

que devuelve un entero que representa el número de días entre las dos fechas.

O si lo necesita cuidarse contra inversión de orden entre las dos instancias Fecha (La operación devuelve números negativos cuando el primer operando es anterior a la segunda):

Math.abs(date2 - date1) 

Los ejemplos anteriores utilizan el maravilloso date.minus(date) implementación del operador que devuelve el número de días entre las dos fechas.

Ejemplo sesión de shell maravilloso:

$ groovysh 
Groovy Shell (2.4.8, JVM: 1.8.0_111) 
Type ':help' or ':h' for help. 

groovy:000> x = new Date(1486382537168) 
===> Mon Feb 06 13:02:17 CET 2017 

groovy:000> y = new Date(1486000000000) 
===> Thu Feb 02 02:46:40 CET 2017 

groovy:000> x - y 
===> 4 

o si necesita un método:

int daysBetween(date1, date2) { 
    Math.abs(date2 - date1) 
} 
0

averiguar el número de días entre dos fechas dadas:

@Test 

public class Demo3 { 

    public static void main(String[] args) { 
     String dateStr ="2008-1-1 1:21:28"; 
     String dateStr2 = "2010-1-2 1:21:28"; 
     SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss"); 
     SimpleDateFormat format2 = new SimpleDateFormat("yyy-MM-dd HH:mm:ss"); 
     try { 
      Date date2 = format.parse(dateStr2); 
      Date date = format.parse(dateStr); 

      System.out.println("distance is :"+differentDaysByMillisecond(date,date2)); 
     }catch(ParseException e){ 
      e.printStackTrace(); 
     } 
    } 

//get Days method 

    private static int differentDaysByMillisecond(Date date, Date date2) { 
     return (int)((date2.getTime()-date.getTime())/1000/60/60/24); 
    } 

} 
No
Cuestiones relacionadas