Pregunta

¿Cómo puedo encontrar la diferencia en días entre dos Joda-Time casos DateTime ? Con ‘diferencia en días’ Quiero decir que si inicio es el lunes y el final es el martes espero un valor de retorno de 1 independientemente de la hora / minuto / segundo de las fechas de inicio y fin.

Days.daysBetween(start, end).getDays() me da inicio 0 si es por la tarde y al final de la mañana.

También estoy teniendo el mismo problema con otros campos de fecha así que esperaba que habría una manera genérica de 'ignorar' los campos de menor importancia.

En otras palabras, los meses entre febrero y 4 de marzo también sería 1, como sería el horas entre 14:45 y 15:12. Sin embargo la diferencia de hora 14:01-14:55 sería 0.

¿Fue útil?

Solución

Era un fastidio, la respuesta withTimeAtStartOfDay está mal, pero sólo de vez en cuando. Que desee:

Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()

Resulta que "la medianoche / Comienzo del día" a veces significa 01 a.m. (horario de verano suceden de esta manera en algunos lugares), que Days.daysBetween no controla correctamente.

// 5am on the 20th to 1pm on the 21st, October 2013, Brazil
DateTimeZone BRAZIL = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, BRAZIL);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, BRAZIL);
System.out.println(daysBetween(start.withTimeAtStartOfDay(),
                               end.withTimeAtStartOfDay()).getDays());
// prints 0
System.out.println(daysBetween(start.toLocalDate(),
                               end.toLocalDate()).getDays());
// prints 1

El ir a través de un LocalDate deja de lado todo el tema.

Otros consejos

Days Clase

Uso de la href="http://www.joda.org/joda-time/apidocs/org/joda/time/Days.html" rel="noreferrer"> Days clase con el withTimeAtStartOfDay método debería funcionar:

Days.daysBetween(start.withTimeAtStartOfDay() , end.withTimeAtStartOfDay() ).getDays() 

LocalDate :

Days.daysBetween(new LocalDate(start), new LocalDate(end)).getDays() 

tl; dr

java.time.temporal.ChronoUnit.DAYS.between( 
    earlier.truncatedTo( ChronoUnit.DAYS )  , 
    later.truncatedTo( ChronoUnit.DAYS ) 
)

... o ...

java.time.temporal.ChronoUnit.HOURS.between( 
    earlier.truncatedTo( ChronoUnit.HOURS )  , 
    later.truncatedTo( ChronoUnit.HOURS ) 
)

java.time

Para su información, el proyecto Joda-Time está ahora en modo de mantenimiento, con el equipo de asesoramiento migración a la clases java.time .

El equivalente de Joda-Time DateTime es ZonedDateTime.

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;

Al parecer desea contar los días de las fechas, lo que significa que quiere hacer caso omiso de la hora del día. Por ejemplo, a partir de un minuto antes de la medianoche y termina un minuto después de la medianoche debe resultar en un solo día. Por este comportamiento, extraiga una LocalDate de su ZonedDateTime. El LocalDate clase representa una fecha de sólo valor sin tiempo de día y sin zona horaria.

LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;

Utilice el ChronoUnit enumeración para calcular transcurrido días u otras unidades.

long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;

Truncar

En cuanto a usted preguntando acerca de una forma más general para hacer esto conteo en el que está interesado el delta de horas como hora-de-la-reloj en lugar de horas completas como luces-de-tiempo de sesenta minutos, utilice el método truncatedTo .

Aquí está su ejemplo de 14:45-15:12 en el mismo día.

ZoneId z = ZoneId.of( "America/Montreal" ); 
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 14 , 45 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 17 , 15 , 12 , 0 , 0 , z );

long hours = ChronoUnit.HOURS.between( start.truncatedTo( ChronoUnit.HOURS ) , stop.truncatedTo( ChronoUnit.HOURS ) );
  

1

Para un recuento de días por fechas, truncado a ChronoUnit.DAYS. Este es un ejemplo rodando sobre la medianoche de cinco minutos antes de cinco minutos después, por los días transcurridos de 1.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 23 , 55 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 18 , 00 , 05 , 0 , 0 , z );

long days = ChronoUnit.DAYS.between( start.truncatedTo( ChronoUnit.DAYS ) , stop.truncatedTo( ChronoUnit.DAYS ) );
  

1


Acerca de java.time

El java.time marco está incorporado en Java 8 y versiones posteriores. Estas clases suplantar a la problemática de edad legado clases de fecha y hora como java.util.Date , Calendar , y SimpleDateFormat .

El Joda-Time proyecto, ahora en < a href = "https://en.wikipedia.org/wiki/Maintenance_mode" rel = "noreferrer nofollow"> el modo de mantenimiento , aconseja migración a la java.time clases .

Para obtener más información, consulte la Oracle Tutorial . Y la búsqueda de desbordamiento de pila durante muchos ejemplos y explicaciones. Especificación es JSR 310 .

Se puede intercambiar java.time objetos directamente con su base de datos. controlador Utilice un JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, sin necesidad de clases java.sql.*.

¿Dónde obtener las clases java.time?

El ThreeTen-Extra Proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles futuras adiciones a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter , y más .

El ThreeTen-Extra Proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles futuras adiciones a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter , y más .

La respuesta aceptada construye dos objetos LocalDate, que son bastante caros si están leyendo gran cantidad de datos. Yo uso este:

  public static int getDaysBetween(DateTime earlier, DateTime later)
  {
    return (int) TimeUnit.MILLISECONDS.toDays(later.getMillis()- earlier.getMillis());
  }

Al llamar getMillis() usted utiliza ya existente variables.
MILLISECONDS.toDays() a continuación, utiliza un simple cálculo aritmético, no crea ningún objeto.

java.time.Period

Utilice la clase java.time.Period a recuento días .

Desde Java 8 calculando la diferencia es más intuitiva utilizando LocalDate, LocalDateTime para representar las dos fechas

    LocalDate now = LocalDate.now();
    LocalDate inputDate = LocalDate.of(2018, 11, 28);

    Period period = Period.between( inputDate, now);
    int diff = period.getDays();
    System.out.println("diff = " + diff);
DateTime  dt  = new DateTime(laterDate);        

DateTime newDate = dt.minus( new  DateTime ( previousDate ).getMillis());

System.out.println("No of days : " + newDate.getDayOfYear() - 1 );    
public static int getDifferenceIndays(long timestamp1, long timestamp2) {
    final int SECONDS = 60;
    final int MINUTES = 60;
    final int HOURS = 24;
    final int MILLIES = 1000;
    long temp;
    if (timestamp1 < timestamp2) {
        temp = timestamp1;
        timestamp1 = timestamp2;
        timestamp2 = temp;
    }
    Calendar startDate = Calendar.getInstance(TimeZone.getDefault());
    Calendar endDate = Calendar.getInstance(TimeZone.getDefault());
    endDate.setTimeInMillis(timestamp1);
    startDate.setTimeInMillis(timestamp2);
    if ((timestamp1 - timestamp2) < 1 * HOURS * MINUTES * SECONDS * MILLIES) {
        int day1 = endDate.get(Calendar.DAY_OF_MONTH);
        int day2 = startDate.get(Calendar.DAY_OF_MONTH);
        if (day1 == day2) {
            return 0;
        } else {
            return 1;
        }
    }
    int diffDays = 0;
    startDate.add(Calendar.DAY_OF_MONTH, diffDays);
    while (startDate.before(endDate)) {
        startDate.add(Calendar.DAY_OF_MONTH, 1);
        diffDays++;
    }
    return diffDays;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top