2010-12-06 17 views
9

Hay código Java, que se ejecuta en 2 entornos diferentes e inserta registros con JdbcTemplate a DB.Restablecer tiempo parte de la instancia de Calendario en Java

Los resultados de su ejecución son diferentes para ambos envs. Particularmente, para los campos Date.

En primer entorno (Oracle XE) Produce registro:

"12/03/2010";191094;"71697211000";3229;880323202;NULL;0;1;0;NULL;0;NULL 

Segundo entorno (Oracle no XE):

"12/03/2010 12:00:00";191094;"71697211000";3229;880323202;NULL;0;1;0;NULL;0;NULL 

NLS_DATE_FORMAT (si es esencial) para el primer env es DD-MON-RR, para el segundo env es DD-MON-RRRR

La pregunta es, ¿qué configuración de Oracle puede afectar, ese segundo formato de fecha env es otro?

+0

Simplemente no almacene/recupere la parte de tiempo en DB. Use un tipo de campo 'DATE', no' TIMESTAMP' o 'DATETIME'. – BalusC

+0

Utilizo el campo Tipo de fecha en DB.Parece que tengo malentendidos con el cliente. Dijo, que 12:00 no debería incluirse. Pero no se muestra con solo select.it se muestra, cuando uso SELECT to_char (a_date, 'DD-mm-aa HH: MI: SS') – sergionni

Respuesta

22

debe establecer las siguientes propiedades del calendario en código Java:

Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY)); 
    cal.set(Calendar.MINUTE, cal.getActualMinimum(Calendar.MINUTE)); 
    cal.set(Calendar.SECOND, cal.getActualMinimum(Calendar.SECOND)); 
    cal.set(Calendar.MILLISECOND, cal.getActualMinimum(Calendar.MILLISECOND)); 

en lugar de:

Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
+6

¿Hay alguna situación en la que pueda devolver no 0? – user12384512

+0

@ user12384512 'getActualMinimum' puede devolver valores que no sean' 0', pero no para los campos mencionados anteriormente. –

3

Si no desea mostrar la parte de tiempo, no incluya una cadena de formato que incluye la parte de tiempo ("HH: MI: SS").

Cuando haya restablecido la pieza del tiempo hasta la medianoche, básicamente ... no hay manera de diferenciar entre un conjunto Calendar o Date exactamente a la medianoche y una CalendarDate o "sin" una parte de tiempo - porque no hay concepto como a Calendar/Date con solo una parte de fecha.

Ahora puede tenerlo en la base de datos, dependiendo de los tipos disponibles, pero java.util.Date y java.util.Calendar siempre representan puntos en el tiempo, no solo fechas.

La razón por la que se muestran 12 en vez de 00 es porque está utilizando "HH" en lugar de "HH24", según la respuesta de lacqui. Asumo que realmente no quiere para ver la hora en absoluto, sin embargo, dado que tendrá que restablecer a la medianoche ...

+0

Jon, entonces de todos modos lo hace 12:00:00 en mycase significa que la parte del tiempo se reinicia? – sergionni

+0

@sergionni: Sí, muestra que lo ha configurado para la medianoche. Si cambia sus llamadas a 'c.set' para usar valores diferentes, también verá los valores apropiados en su versión formateada. –

+0

@Jon: acabo de recibir el script de inicio real de esta tabla y este campo se ve así: a_date FECHA "MM/DD/AAAA HH24: MI: SS" NULLIF (a_date = "NULL"). – sergionni

4

Según the documentation, HH refiere a un tiempo de 12 horas. El 12 en el tiempo que está recuperando es a las 12 de la noche. Lo que quiere es HH24, que le ofrece un horario de 24 horas, comenzando a las 00 para la medianoche.

2

me gustaría recomendar a ampliar una de las clases del calendario de esta manera:

public class CalendarDateOnly extends GregorianCalendar { 

    public static Calendar getInstance() { 
     Calendar cal = Calendar.getInstance(); 
     cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY)); 
     cal.set(Calendar.MINUTE,  cal.getActualMinimum(Calendar.MINUTE)); 
     cal.set(Calendar.SECOND,  cal.getActualMinimum(Calendar.SECOND)); 
     cal.set(Calendar.MILLISECOND, cal.getActualMinimum(Calendar.MILLISECOND)); 
     return cal; 
    } 
} 

Crear una instancia de esta manera:

Calendar june30 = CalendarDateOnly.getInstance(); 
june30.set(2000, Calendar.JUNE, 30); 
+0

se ve bien, gracias por la pista – sergionni

1
/* 
* Date : 2015-07-09 
* Author : Bhuwan Prasad Upadhyay 
*/ 
package com.developerbhuwan.date.utils; 

import java.util.Calendar; 
import java.util.Date; 

/** 
* 
* @author developerbhuwan 
*/ 
public class CalenderUtils { 

    public static Calendar getNewCalendarInstance() { 
     Calendar calendar = Calendar.getInstance(); 
     return resetCalender(calendar); 
    } 

    public static Date resetDate(Date date) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 
     return resetCalender(calendar).getTime(); 
    } 

    public static Calendar resetCalender(Calendar calendar) { 
     calendar.set(Calendar.HOUR_OF_DAY, 0); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 
     return calendar; 
    } 

    public static void setTimeInCalendar(Calendar calendar, Date date) { 
     calendar.setTime(resetDate(date)); 
    } 

} 
Cuestiones relacionadas