簡體   English   中英

將LocalDate轉換為LocalDateTime或java.sql.Timestamp

[英]Convert LocalDate to LocalDateTime or java.sql.Timestamp

我正在使用JodaTime 1.6.2。

我有一個LocalDate ,我需要將其轉換為(Joda) LocalDateTimejava.sqlTimestamp進行映射。

原因是我已經弄清楚了如何在LocalDateTimejava.sql.Timestamp之間進行轉換:

LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));

因此,如果我可以在LocalDateLocalDateTime之間進行轉換,則可以繼續轉換為java.sql.Timestamp 感謝您朝着正確的方向前進!

喬達時間

要將JodaTime的org.joda.time.LocalDate轉換為java.sql.Timestamp ,只需執行

Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());

要將JodaTime的org.joda.time.LocalDateTime轉換為java.sql.Timestamp ,只需執行

Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());

Java時間

要將Java8的java.time.LocalDate轉換為java.sql.Timestamp ,只需執行

Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());

要將Java8的java.time.LocalDateTime轉換為java.sql.Timestamp ,只需執行

Timestamp timestamp = Timestamp.valueOf(localDateTime);

使用Java 8時間API的最佳方法:

  LocalDateTime ldt = timeStamp.toLocalDateTime();
  Timestamp ts = Timestamp.valueOf(ldt);

用於與模型一起插入的JPA( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa ):

@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime ldt) {
        return Timestamp.valueOf(ldt);
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp ts) {
        return ts.toLocalDateTime();
    }
}

所以現在是相對時區獨立時間。 此外,很容易做到:

  LocalDate ld = ldt.toLocalDate();
  LocalTime lt = ldt.toLocalTime();

格式:

 DateTimeFormatter DATE_TME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
 String str = ldt.format(DATE_TME_FORMATTER);
 ldt = LocalDateTime.parse(str, DATE_TME_FORMATTER);

更新:postgres 9.4.1208,HSQLDB 2.4.0等無需任何對話即可理解Java 8 Time API!

tl; dr

Joda-Time項目處於維護模式,現在已由java.time類取代。

  • 只需使用java.time.Instant類。
  • 無需:
    • LocalDateTime
    • java.sql.Timestamp
    • 弦樂

在UTC中捕獲當前時刻。

Instant.now()  

將該時刻存儲在數據庫中:

myPreparedStatement.setObject( … , Instant.now() )  // Writes an `Instant` to database.

要從datbase檢索該時刻:

myResultSet.getObject( … , Instant.class )  // Instantiates a `Instant`

將壁鍾時間調整為特定時區的時間。

instant.atZone( z )  // Instantiates a `ZonedDateTime`

LocalDateTime是錯誤的類

其他答案是正確的,但它們未能指出LocalDateTime是您所用的錯誤類。

java.timeJoda-Time中LocalDateTime故意缺少任何時區或UTC偏移量的概念。 因此,它並不代表一個時刻,是不是在時間軸上的一個點。 LocalDateTime表示有關大約26-27小時范圍內的潛在時刻的粗略想法。

當區域/偏移量未知(不是很好的情況)或區域偏移量不確定時,請使用LocalDateTime 例如,“聖誕節始於2018年12月25日的第一刻”將表示為LocalDateTime

使用ZonedDateTime表示特定時區中的時刻。 例如,從任何特定區域(如Pacific/AucklandAmerica/Montreal開始的聖誕節將用ZonedDateTime對象表示。

暫時在UTC中使用Instant

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

應用時區。 時間軸上的相同時刻,相同點,但使用不同的掛鍾時間查看。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;  // Same moment, different wall-clock time.

因此,如果我可以在LocalDate和LocalDateTime之間進行轉換,

不,錯誤的策略。 如果您有一個僅日期的值,並且想要一個日期時間值,則必須指定一個時間。 該日期可能在該日期對於特定區域是無效的–在這種情況下, ZonedDateTime類會根據需要自動調整日期。

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ;  // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

如果希望將一天的第一時刻作為時刻,則讓java.time確定該時刻。 不要以為一天從00:00:00開始。 諸如夏令時(DST)之類的異常表示一天可能在另一個時間(例如01:00:00)開始。

ZonedDateTime zdt = ld.atStartOfDay( z ) ;

java.sql.Timestamp是錯誤的類

java.sql.Timestamp是麻煩的舊日期時間類的一部分,而現在這些時間類已成為舊版,而完全被java.time類所取代。 該類用於表示UTC中具有納秒分辨率的時刻。 現在可以通過java.time.Instant該目的。

帶有getObject / setObject JDBC 4.2

JDBC 4.2及更高版本開始,您的JDBC驅動程序可以通過調用以下命令直接與數據庫交換java.time對象:

例如:

myPreparedStatement.setObject( … , instant ) ;

……和……

Instant instant = myResultSet.getObject( … , Instant.class ) ;

轉換舊的⬌現代

如果必須使用尚未更新為java.time的舊代碼進行接口 ,請使用添加到舊類中的新方法來回轉換。

Instant instant = myJavaSqlTimestamp.toInstant() ;  // Going from legacy class to modern class.

…和…

java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ;  // Going from modern class to legacy class.

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

根據您的時區,您可能會損失幾分鍾(1650-01-01 00:00:00變成1649-12-31 23:52:58)

使用以下代碼可以避免這種情況

new Timestamp(localDateTime.getYear() - 1900, localDateTime.getMonthOfYear() - 1, localDateTime.getDayOfMonth(), localDateTime.getHourOfDay(), localDateTime.getMinuteOfHour(), localDateTime.getSecondOfMinute(), fractional);

由於Joda逐漸淡出,有人可能希望在Java 8 LocaltDate轉換為LocalDateTime 。在Java 8 LocalDateTime ,它將提供一種使用LocalDateLocalTime創建LocalDateTime實例的方法。 在這里檢查

公共靜態LocalDateTime((LocalDate日期,LocalTime時間)

樣本是

    // just to create a sample LocalDate
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
    LocalDate ld = LocalDate.parse("20180306", dtf);

    // convert ld into a LocalDateTime
    // We need to specify the LocalTime component here as well, it can be any accepted value
    LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

僅供參考,可以使用下面的紀元秒,

    ZoneId zoneId = ZoneId.systemDefault();
    long epoch = ldt.atZone(zoneId).toEpochSecond(); 

    // If you only care about UTC
    long epochUTC = ldt.toEpochSecond(ZoneOffset.UTC);

java.time.LocalDate對象的函數調用asStartOfDay()返回一個java.time.LocalDateTime對象

Java8 +

import java.time.Instant;
Instant.now().getEpochSecond(); //timestamp in seconds format (int)
Instant.now().toEpochMilli(); // timestamp in milliseconds format (long)

暫無
暫無

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

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