簡體   English   中英

如何將帶有毫秒的java.time.LocalTime映射到帶有毫秒的java.sql.Time

[英]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.Datejava.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.TimeAndres的回答會顯示正確而精確的轉換方式。 挑戰在於簡單的Time.valueOf(LocalTime)失去了秒的分數。 文檔說:

LocalTime的納秒字段不是新創建的Time對象的一部分。

很明顯,你不能擁有所有納秒,因為Time只有毫秒的精度。 為什么他們沒有花費毫秒(9位數納秒值的前三個十進制數字),我不知道。 安德烈亞斯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM