2008-12-05 9 views
6

Estoy retirando una fecha y una hora de una base de datos. Se almacenan en campos separados, pero me gustaría combinarlos en un objeto java.util.Date que refleje la fecha/hora de forma adecuada.¿Cómo combino un objeto java.util.Date con un objeto java.sql.Time?

Aquí está mi enfoque original, pero está defectuoso. Siempre termino con una fecha/hora que es de 6 horas de lo que debería ser. Creo que esto se debe a que Time tiene un offset de zona horaria, así como la fecha, y realmente solo necesito que uno de ellos tenga el desplazamiento de la zona horaria.

¿Alguna sugerencia sobre cómo hacer esto para que me dé la fecha/hora correcta?

import java.sql.Time; 
import java.util.Calendar; 
import java.util.Date; 

import org.apache.commons.lang.time.DateUtils; 
    public static Date combineDateTime(Date date, Time time) 
     { 
      if (date == null) 
       return null; 
      Date newDate = DateUtils.truncate(date, Calendar.DATE); 
      if (time != null) 
      { 
       Date t = new Date(time.getTime()); 
       newDate = new Date(newDate.getTime() + t.getTime()); 
      } 
      return newDate; 
     } 

Respuesta

10

me gustaría poner la fecha y la hora en objetos de calendario y, a continuación, utilizar los distintos métodos Calendario para extraer los valores de tiempo desde el segundo objeto y ponerlos en la primera.

Calendar dCal = Calendar.getInstance(); 
    dCal.setTime(date); 
    Calendar tCal = Calendar.getInstance(); 
    tCal.setTime(time); 
    dCal.set(Calendar.HOUR_OF_DAY, tCal.get(Calendar.HOUR_OF_DAY)); 
    dCal.set(Calendar.MINUTE, tCal.get(Calendar.MINUTE)); 
    dCal.set(Calendar.SECOND, tCal.get(Calendar.SECOND)); 
    dCal.set(Calendar.MILLISECOND, tCal.get(Calendar.MILLISECOND)); 
    date = dCal.getTime(); 
+0

Calendar.getInstance() crea una nueva instancia de calendario cada llamada. El calendario es muy pesado y no es seguro para subprocesos. Si bien esto es técnicamente una forma correcta de hacerlo, hay formas mucho mejores de hacerlo. –

+2

Si hay una mejor manera, ¿podría publicarlo? – ScArcher2

+0

Bueno, si le preocupa crear demasiados calendarios, puede crear uno para la parte de la fecha y uno para el tiempo, y simplemente continúe reiniciándolos con dCal.setTime (date) y tCal.setTime (time); –

5

Utilice Joda Time en lugar de las propias clases de fecha de Java al hacer este tipo de cosas. Es una API de fecha/hora muy superior que hace que el tipo de cosas que intenta hacer sea extremadamente fácil y confiable.

1

Suponiendo que conoce el huso horario de la hora que se lee de la base de datos, necesita utilizar el método ResultSet.getTime(String, Calendar) que estableció previamente la zona horaria en el Calendar. El controlador JDBC hará los ajustes necesarios a la hora.

Si todo el código se ejecuta en el lado del servidor, recomiendo estandarizar en la zona horaria común (probablemente UTC) para todos los tiempos y convertir según corresponda al mostrar la representación en la GUI.

También usaría JodaTime (http://joda-time.sourceforge.net), le ahorrará dolores de cabeza en el futuro.

4

@Paul Tomblin es una forma segura de controlar el problema TimeZone, y sabía que alguien iba a lanzar "Joda Time" en la mezcla. Las otras respuestas son todos buenos y más robusto que el siguiente truco:

Si la aplicación se ejecuta en el mismo TimeZone como viene por defecto en el PP, que podría ser capaz de salirse con la siguiente:

Si se salta este paso:

Date t = new Date(time.getTime()); 

y utilizar el valor java.sql.Time directamente, como:

newDate = new Date(newDate.getTime() + time.getTime()); 

la conversión a la no se introducirá por defecto TimeZone - el java.sql.Time debe contener el valor almacenado.

tu caso es distinto, Cuidado con este hotel, etc ...

Cuestiones relacionadas