2010-08-30 31 views
5

Estoy obteniendo algunos datos de una base de datos que tiene un valor de fecha almacenado, y estoy dejando que el usuario elija los intervalos de fechas para los que desea ver los datos. Todo mi código para obtener estos rangos de fechas funciona, excepto por el método para obtener el rango de fechas que cubre todo el tiempo, que sería un valor de inicio de los manejadores Java de datos más antiguos posibles, hasta el valor final de la fecha máxima posible.Java: Rango de fechas mín. Y máx.

¿Hay algo malo en mi código, porque no puedo ver un problema:

public static DateRange getAllTime() { 
     /** 
     * Get earliest possible 
     */ 
     Calendar c = Calendar.getInstance(); 
     c.set(
       c.getActualMinimum(Calendar.YEAR), 
       c.getActualMinimum(Calendar.MONTH), 
       c.getActualMinimum(Calendar.DAY_OF_MONTH), 
       c.getActualMinimum(Calendar.HOUR), 
       c.getActualMinimum(Calendar.MINUTE), 
       c.getActualMinimum(Calendar.SECOND) 
      ); 

     c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND)); 
     Date start = c.getTime(); 

     /** 
     * Get latest possible date 
     */ 
     c.set(
       c.getActualMaximum(Calendar.YEAR), 
       c.getActualMaximum(Calendar.MONTH), 
       c.getActualMaximum(Calendar.DAY_OF_MONTH), 
       c.getActualMaximum(Calendar.HOUR), 
       c.getActualMaximum(Calendar.MINUTE), 
       c.getActualMaximum(Calendar.SECOND) 
      ); 

     c.set(Calendar.MILLISECOND, c.getActualMaximum(Calendar.MILLISECOND)); 
     Date end = c.getTime(); 

     DateRange range = new DateRange(); 
     range.Start = start; 
     range.End = end; 

     return range; 
    } 
+0

¿Qué devuelve su método? –

Respuesta

4

¿Por qué hacer la vida tan complicada? Si no tiene una fecha de inicio, no consulte una fecha de inicio. Si no tiene una fecha de finalización, no consulte una fecha de finalización. Y si no tiene ninguno, no consulte las fechas en absoluto.

+0

Jaja, sí, eso es lo que terminé haciendo. Este fue un caso especial, y como cada uno de los otros casos tenía un inicio/final, solo usé un método. Terminó escribiendo un método para cubrir este caso y escribió una consulta que no verificó la fecha. Dicho esto, me molesta no saber y realmente me gustaría saber por qué esto no estaba funcionando. –

0

Ese código me funciona, ¿quizás no está esperando los valores que devuelve?

de inicio: Mar Ene 01 00:00:00 PST 1 Fin: Mié Abr 17 de 21:34:08 PST 292269054

(Sería más fácil ayudar si se incluye el seguimiento de pila)

17

por qué no usar

  1. new Date (Long.MIN_VALUE) (en el año 292 269 055 aC)
  2. new Date (Long.MAX_VALUE) (en el año 292 278 994 dC)?

Desde froginvasion desafió la respuesta, pensé doble Vea

long day=1000*60*60*24; 
    System.out.println(new Date(Long.MAX_VALUE-day)); 
    System.out.println(new Date(Long.MAX_VALUE)); 
    System.out.println(new Date(0)); 
    System.out.println(new Date(-day)); 
    System.out.println(new Date(Long.MIN_VALUE)); 
    System.out.println(new Date(Long.MIN_VALUE+day)); 

me dio

Sat Aug 16 07:12:55 GMT 292278994 
Sun Aug 17 07:12:55 GMT 292278994 
Thu Jan 01 00:00:00 GMT 1970 
Wed Dec 31 00:00:00 GMT 1969 
Sun Dec 02 16:47:04 GMT 292269055 
Mon Dec 03 16:47:04 GMT 292269055 

Creo que es lo correcto. Supongo que el AD/BC simplemente está siendo suprimido. La sugerencia de utilizar nueva Fecha (0) como el mínimo es claramente incorrecta porque la nueva Fecha (-día) es claramente más pequeña.

+0

¡Solución simple y elegante! – nobre

+0

¡De acuerdo !, ¡muy bueno para usar valores estáticos para esto! +1 – will824

+1

'new Date (Long.MIN_VALUE)' no funcionará, pruébalo.En realidad, no hace algo que esperarías. Si desea usar esto, use 'new Date (0)' que está en 1 de enero de 1970. – froginvasion

0

Sospecho que puede obtener un desbordamiento configurando el año y luego estableciendo los valores máximos para todos los demás campos por separado. Eso haría que tu hora de finalización esté en algún lugar alrededor de tu hora de inicio y hará que todos los registros sean rechazados. Puede tratar simplemente de imprimir los tiempos de calendario para ver qué está sucediendo.

Como señalaremos, realmente está haciendo esto más complicado de lo que debería ser, la forma correcta de tratar esto es dejar la cláusula de fecha completamente fuera de la consulta. Eso puede ser difícil a veces porque el enunciado sql no se genera dinámicamente. Pero tenga en cuenta que incluso si no se puede modificar el SQL en tiempo de ejecución, la condición (en Oracle)

start_date >= nvl(?, start_date) 

siempre será satisfecha si el valor proporcionado es nulo y fecha_inicial está poblada.

Cuestiones relacionadas