2012-02-23 19 views
6

Quiero convertir un objeto LocalTime en un objeto java.sql.Time.Convertir joda LocalTime a sql Time

java.sql.Time time = new java.sql.Time(new LocalTime(1,0,0,0).getMillisOfDay()); 
System.out.println(time); //20:00:00 

el código anterior, en lugar de crear un objeto de tiempo con un valor igual a 01:00:00, crea un objeto con un tiempo de 20:00:00. La hora local es hora del este.

¿Qué pasos debo seguir?

Respuesta

6

Time(..) acepta una marca de tiempo a partir de 1970. Por lo que debe suceder que:

new Time(new LocalTime(...).toDateTimeToday().getMillis())

6

Considero que la respuesta aceptada actualmente es incorrecta. Aunque java.sql.Time implica que sus campos de fecha están configurados en 1970-1-1, esto no es cierto. Si utiliza la conversión

new java.sql.Time(new LocalTime(...).toDateTimeToday().getMillis()) 

entonces la representación millesecond interna del objeto java.sql.Time reflejará la fecha de hoy. Esto conduce a un comportamiento inesperado cuando se comparan los objetos java.sql.Time. Las comparaciones se realizan en el valor de milisegundos, y si las fechas subyacentes son diferentes, los campos de tiempo son irrelevantes para el resultado de comparación

Un método mejor es trabajar explícitamente con los campos de tiempo, utilizando el constructor obsoleto y los métodos en java.sql.Time:

LocalTime localTime = new LocalTime(1,0,0,0); 
java.sql.Time sqlTime = new java.sql.Time(localTime.getHourOfDay(), localTime.getMinuteOfHour(), localTime.getSecondOfMinute()) 

del mismo modo, en la otra dirección

java.sql.Time sqlTime = new java.sql.Time(1,0,0); 
LocalTime localTime = new LocalTime(sqlTime.getHours(), sqlTime.getMinues(), sqlTime.getSeconds()); 
+2

Utilizando métodos obsoletos es una mala práctica. – pgerstoft

+3

Claro que sí, pero tienes que saber cuándo romper las reglas. Estos métodos en desuso son la manera más simple y más eficiente de lograr el objetivo, y no hay planes para eliminarlos de Java en el futuro previsible. Francamente, Sun nunca debería haberlos desaprobado; el horrible desastre que los reemplaza es la razón completa para pasar a la implementación más limpia, como JodaTime. –

0

Este parece ser un agujero en la API Joda Time. En este momento getLocalMillis() es protected, pero ese es exactamente el método que me gustaría usar.

Sin embargo, si se quiere evitar métodos obsoletos, se puede averiguar el tiempo el 1 de enero, 1970:

LocalTime lt = new LocalTime(1, 23, 45, 678); 
long millis = lt.toDateTimeToday().withDate(1970, 1, 1).getMillis() 
java.sql.Time time = new java.sql.Time(millis); 

Esto parece funcionar. Curiosamente, traté de calcular los millis multiplicando los valores de los campos. Eso produjo el valor correcto long, pero cuando lo pasé al constructor Time, sucedió algo extraño con la zona horaria. (Creo que, al menos. El valor Time terminó cinco horas antes del valor que pasé, y estoy en horario de verano del Este, así que creo que eso es lo que sucedió.)

0

encontré otra forma de convertir el java.time.LocalTime a java.time.LocalTime

LocalTime localTime = LocalTime.now(); 
Time time = Time.valueOf(localTime); 
+0

La pregunta es respecto a LocalTime en Joda-Time, no a la clase LocalTime agregada en Java 8. –

Cuestiones relacionadas