[英]How to map java.time.LocalTime with milliseconds to a java.sql.Time with miliseconds
如何將java.time.LocalTime
的分數(微/毫/納米)轉換為java.sql.Time
?
我知道,自2.x版本的spring-data-jpa
以來,這些類型(JSR310)的自定義轉換器映射到舊版java.sql.Date
和java.sql.Timestamp
但我的分數存在很多問題LocalTime
的第二部分。
如何將
java.time.LocalTime
映射到java.sql.Time
這是一種不使用String
作為中間值的方法。
java.time.LocalTime localTime = java.time.LocalTime.now();
long epochMilli = localTime.atDate(java.time.LocalDate.EPOCH)
.atZone(java.time.ZoneId.systemDefault())
.toInstant()
.toEpochMilli();
java.sql.Time sqlTime = new java.sql.Time(epochMilli);
System.out.println(localTime.format(DateTimeFormatter.ofPattern("HH:mm:ss.SSS")));
System.out.println(new SimpleDateFormat("HH:mm:ss.SSS").format(sqlTime));
產量
22:28:22.104
22:28:22.104
根本問題是當地時間代表白天的特定時間:
例如下午7:30
今天或昨天不是晚上7:30,也不是周日晚上十七周,只是......晚上7:30。
而java.sql.Time表示特定日期的特定時間 。
在內部,它們被存儲為長 ,這是特定日期之前或之后的毫秒數(IIRC 1970年1月1日)。
因此,要將LocalTime轉換為java.sql.Time,您必須指定該時間將應用的特定日期。
看看LocalTime.atDate(LocalDate),它返回一個LocalDateTime。
似乎沒有一個很好的簡單方法來提取毫秒或凈納秒(自1/1/1970 00:00:00)
也許嘗試.toEpochSecond(需要指定一個時區)然后將其乘以1000或1000000並將其寫入數據庫,然后將其讀回(以查看它是否有效)。
交替:
你一直說你不想要約會 - 我明白了,但由於數據庫沒有,你可以嘗試存儲localTime.toNanoOfDay。
它將把它解釋為1970年1月1日的一天。
您很可能不希望從LocalTime
轉換為老式Time
。
如果您認為需要java.sql.Time
來存儲到SQL數據庫或對其進行查詢,則情況可能並非如此。 如果您至少可以使用Java 8和至少JDBC 4.2(或現代JPA實現),則可以直接對數據庫使用LocalTime
,無需轉換。 用例如
yourPreparedStatement.setObject(7, yourLocalTime);
那你就沒事了。
如果你確實需要一個java.sql.Time
, Andres的回答會顯示正確而精確的轉換方式。 挑戰在於簡單的Time.valueOf(LocalTime)
失去了秒的分數。 文檔說:
LocalTime的納秒字段不是新創建的Time對象的一部分。
很明顯,你不能擁有所有納秒,因為Time
只有毫秒的精度。 為什么他們沒有花費毫秒(9位數納秒值的前三個十進制數字),我不知道。 安德烈亞斯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.