2012-02-23 54 views
6

Tôi muốn chuyển đổi một đối tượng LocalTime thành một đối tượng java.sql.Time.Chuyển đổi joda LocalTime thành sql Time

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

Mã trên, thay vì tạo đối tượng Thời gian có giá trị bằng 01:00:00, tạo đối tượng với thời gian 20:00:00. Giờ địa phương là giờ miền đông.

Tôi nên thực hiện các bước nào?

Trả lời

6

Time(..) chấp nhận một dấu thời gian bắt đầu từ năm 1970. Vì vậy, bạn phải vượt qua rằng:

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

6

tôi xem xét các câu trả lời chấp nhận hiện nay là không chính xác. Mặc dù java.sql.Time ngụ ý rằng các trường ngày tháng của nó được đặt là 1970-1-1, điều này không đúng. Nếu bạn sử dụng chuyển đổi

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

thì biểu diễn millesecond nội bộ của đối tượng java.sql.Time sẽ phản ánh ngày hôm nay. Điều này dẫn đến hành vi bất ngờ khi so sánh các đối tượng java.sql.Time. So sánh được thực hiện trên giá trị mili giây và nếu các ngày cơ bản khác nhau, các trường thời gian không liên quan đến kết quả so sánh

Phương pháp tốt hơn là làm việc rõ ràng với các trường thời gian, sử dụng hàm tạo và phương thức không được chấp nhận trong 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()) 

Tương tự, theo một hướng khác

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

Sử dụng phương pháp phản đối là xấu thực hành. – pgerstoft

+3

Chắc chắn nó là, nhưng bạn phải biết khi nào để phá vỡ các quy tắc. Các phương pháp không được chấp nhận này là cách đơn giản và hiệu quả nhất để đạt được mục tiêu, và không có kế hoạch loại bỏ chúng khỏi Java trong tương lai gần. Thành thật mà nói, Sun không bao giờ nên phản đối họ; sự lộn xộn khủng khiếp thay thế chúng là toàn bộ lý do để chuyển sang việc thực hiện sạch hơn như JodaTime. –

0

Điều này có vẻ giống như một lỗ trong API Joda Thời. Ngay bây giờ getLocalMillis()protected, nhưng đó chính xác là phương pháp tôi muốn sử dụng.

Tuy nhiên, nếu bạn muốn tránh các phương pháp không dùng nữa, bạn có thể tìm ra thời gian trên ngày 1 tháng 1 năm 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); 

Điều này dường như làm việc. Thật thú vị, tôi đã cố gắng tìm ra các millis bằng cách nhân các giá trị của các trường ra ngoài. Điều đó tạo ra giá trị long phù hợp, nhưng khi tôi chuyển nó cho nhà xây dựng Time, điều gì đó kỳ lạ đã xảy ra với múi giờ. (Tôi nghĩ rằng, ít nhất. Giá trị Time đã kết thúc sau năm giờ trước khi giá trị tôi chuyển vào và tôi đang ở thời gian ban ngày phía đông, vì vậy tôi nghĩ đó là những gì đã xảy ra.)

0

tôi tìm thấy cách khác để chuyển đổi java.time.LocalTime-java.time.LocalTime

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

Câu hỏi liên quan đến LocalTime trong Joda-Time, không phải lớp LocalTime được thêm vào trong Java 8. –

Các vấn đề liên quan