2012-02-23 6 views
6

Chcę przekonwertować obiekt LocalTime na obiekt java.sql.Time.Konwersja joda LocalTime na sql Czas

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

Powyższy kod, zamiast tworzenia obiektu razem z wartością równą 01:00:00, tworzy obiekt z czasem 20:00:00. Czas lokalny to czas wschodni.

Co należy zrobić?

Odpowiedz

6

Time(..) akceptuje datownik począwszy od roku 1970. Należy więc zdać że:

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

6

uważam obecnie akceptowana odpowiedź będzie błędna. Chociaż java.sql.Time oznacza, że ​​jego pola daty są ustawione na 1970-1-1, nie jest to prawdą. Jeśli używasz konwersję

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

następnie wewnętrzna reprezentacja millesecond obiektu java.sql.Time będzie odzwierciedlać dzisiejszą datę. Prowadzi to do nieoczekiwanego zachowania podczas porównywania obiektów java.sql.Time. Porównania są wykonywane w milisekundach, a jeśli daty bazowe są różne, pola czasu są nieistotne dla wyniku porównania.

Lepszą metodą jest bezpośrednia praca z polami czasowymi przy użyciu przestarzałego konstruktora i metod w 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()) 

Podobnie, w drugim kierunku

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

Korzystanie przestarzałe metody jest złą praktyką. – pgerstoft

+3

Oczywiście, ale musisz wiedzieć, kiedy złamać zasady. Te nieaktualne metody są najprostszym i najskuteczniejszym sposobem osiągnięcia tego celu. W najbliższej przyszłości nie planuje się ich usuwania z Javy. Szczerze mówiąc, Sun nigdy nie powinien ich zdeprecjonować; okropny bałagan, który je zastępuje, jest jedynym powodem, aby przejść do czystszej implementacji, takiej jak JodaTime. –

0

wydaje się to, jak w otworze API Joda czasu. Teraz getLocalMillis() jest protected, ale to jest dokładnie ta metoda, której chciałbym użyć.

Jednakże, jeśli chcesz uniknąć metod wycofywanych, można dowiedzieć się, czas od 1 stycznia 1970 roku:

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); 

To wydaje się działać. Co ciekawe, próbowałem odgadnąć millis, mnożąc wartości pól. To wytworzyło właściwą wartość long, ale kiedy przekazałem ją do konstruktora Time, coś dziwnego stało się ze strefą czasową. (Myślę przynajmniej, że wartość Time skończyła się na pięć godzin przed wartością, którą podałem, i jestem na Wschodnim Czasie Letnim, więc myślę, że tak się stało.)

0

znalazłem inny sposób na konwersję java.time.LocalTime do java.time.LocalTime

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

Pytanie dotyczy LocalTime w Joda-Time, a nie klasy LocalTime dodanej w Javie 8. –