Comparar fechas ignorando los segundos y el milisegundo instantáneo de DateTime en Joda

Asumamos que tengo dos fechas como las siguientes.

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45");
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45");

Quiero comparar estas dos fechas para ver si firstDatees más temprano, más tarde o igual asecondDate .

Podría intentar lo siguiente.

System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.isBefore(secondDate));
System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.isAfter(secondDate));
System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.equals(secondDate));

Lo que produce este código es exactamente lo que quiero.

Produce el siguiente resultado.

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = true

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = false

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = false

Necesito ignorar los segundos y la porción de milisegundos de estas fechas. He intentado usar los métodos withSecondOfMinute(0)y withMillis(0)como el siguiente.

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45").withSecondOfMinute(0).withMillis(0);
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45").withSecondOfMinute(0).withMillis(0);        

Pero produjo el siguiente resultado.

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = false

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = false

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = true

La documentación del withSecondOfMinute()método describe.

Devuelve una copia de esta fecha y hora con el campo del segundo minuto actualizado. DateTime es inmutable, por lo que no hay métodos establecidos. En cambio, este método devuelve una nueva instancia con el valor de segundo de minuto cambiado.

Y los documentos del método withMillis()dicen.

Devuelve una copia de esta fecha y hora con diferentes millis. El objeto devuelto será una nueva instancia o esta. Solo los millis cambiarán, la cronología y la zona horaria se mantienen.

Comparar fechas ignorando completamente la parte del tiempo se puede hacer fácilmente usando DateTimeComparator.getDateOnlyInstance()más o menos lo siguiente.

if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)==0){}
if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)<0){}
if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)>0){}

¿Cómo comparar dos fechas ignorando el instante específico en DateTime(segundos y milisegundos en este caso)?

Respuesta 1

Creo que quieres usar en DateTime#withMillisOfSecond()lugar de DateTime#withMillis():

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45").withSecondOfMinute(0).withMillisOfSecond(0);
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45").withSecondOfMinute(0).withMillisOfSecond(0);

Ajuste DateTime#withMillis()a 0, se restablecerá ambas fechas a 1/1/1970, y por lo tanto se obtiene truedeequals llamada en ellos.

Del mismo modo, establecer DateTime#withMillisOfDay()en 0, establecerá el tiempo en midnight.

Respuesta: 2

Otro enfoque es crear un DateTimeComparator con minutos como límite inferior:

DateTimeComparator comparator = DateTimeComparator.getInstance(
         DateTimeFieldType.minuteOfHour());

que ignoraría las partes de segundo y milisegundo de los objetos que se comparan.

Respuesta: 3

Sé que este tema no es nuevo, aunque tengo que desenterrarlo nuevamente. Ya busqué en la web varias veces (incluidos algunos subprocesos aquí en stackoverflow) pero no he encontrado una respuesta satisfactoria hasta ahora. ...

Actualmente estoy buscando una biblioteca de Java (o una biblioteca nativa con una API de Java) para analizar y evaluar fórmulas. Utilizando las recomendaciones de aquí, eché un vistazo a muchas bibliotecas: JFormula JEval ...

Tengo la siguiente interfaz: public interface ClusterPopulation {public double computeDistance (ClusterPopulation other); } ¿Es posible especificar dentro de la interfaz misma, que ...

No puedo obtener el nombre del grupo bajo el cual se almacena el contacto. Puedo saber si se agrega en cualquier grupo como valor booleano (IN_VISIBLE_GROUP). No tengo idea de cómo obtener el nombre o id del grupo. ...