簡體   English   中英

將Joda LocalDate或java.util.Date轉換為LocalDateTime,在開始時間有時間

[英]Convert Joda LocalDate or java.util.Date to LocalDateTime having time at Start of the Day

我正在使用Joda 2.5

將Joda LocalDate轉換為LocalDateTime時遇到問題。

作為,我能夠將TimeDateTime的LocalDate轉換為DateTime。 我想要相同的功能,但要通過LocalDateTime對象。

我的代碼是:

假設Date來自不同的REST服務,例如

Date currentDate = new Date("2015-02-05");

現在,此日期將傳遞到其他服務,如下所示:

funService(currentDate);

public funService(Date currentDate)
{
       LocalDate localDateObject = new LocalDate(date);

// Now I have to convert this Date to LocalDateTime
    LocalDateTime localDateTime = localDateObject.toDateTimeAtStartOfDay();
//But this returns DateTime Object.

// As I don't want to store the DateTime Object because it also stores the TimeZone


}

我想要LocalDateTime對象,因為我將此LocalDateTime作為時間戳存儲在mysql中。

請提供將LocalDate轉換為LocalDateTime對象的解決方案。

例如:'2015-02-01'至'2015-02-01 00:00:01'YYYY-MM-DD至YYYY-MM-DD HH:MM:SS:zzz

但不是LocalDate到DateTime

好了,一旦您擺脫了時區異常,就可以假設每天都是從午夜開始,因此請使用:

LocalDateTime localDateTime = localDate.toLocalDateTime(LocalTime.MIDNIGHT);

為什么你想以1秒過了午夜,結束了目前尚不清楚。 如果確實需要,請創建自己的常量LocalTime表示該常量,並在上面的代碼中使用它代替MIDNIGHT

另請注意,如果您實際上有一個Date ,那么您可能已經丟失了信息。 聽起來傳入的數據確實是一個字符串-最好直接將其解析為LocalDate以避免時區可能引起問題。

TL;博士

myPreparedStatement.setObject(       // Insert object into database for `TIMESTAMP WITHOUT TIME ZONE` type of column.
    … , 
    LocalDate.parse( "2015-02-05" )  // Parse input string to a date-only value lacking time-of-day and lacking time zone.
             .atStartOfDay()         // Determine start of a generic 24-hour day for a `LocalDateTime` object lacking offset-from-UTC and lacking time zone.
) ;

java.time

Joda-Time項目現在處於維護模式 ,團隊建議遷移到java.time類。 請參見Oracle教程

解析您的輸入字符串

LocalDate ld = LocalDate.parse( "2015-02-05" ) ;

不分區

如果您的業務問題缺少任何與UTC的偏移量或時區,而不是時間軸上的特定時刻,則可以通過轉換為LocalDateTime來獲取24小時全天的第一時刻。

LocalDateTime ldt = ld.atStartOfDay() ;

ldt.toString():2015-02-05T00:00

要將其存儲在數據庫中類似SQL標准類型的TIMESTAMP WITHOUT TIME ZONE的數據類型的列中,請將java.time對象與兼容JDBC 4.2及更高版本的JDBC驅動程序一起使用。 最好與數據庫交換對象,而不是單純的字符串。

myPreparedStatement.setObject( … , ldt ) ;

…和…

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

如果您的業務問題確實需要偏移量或區域,則必須指定在時間軸上獲得實際點。

一天的第一時刻並不總是00:00:00。 諸如夏令時(DST)之類的異常表示一天可能在另一個時間(例如01:00:00)開始。 讓java.time通過調用LocalDate::atStartOfDay來確定一天的第一時刻。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;

zdt.toString():2015-02-05T00:00 + 01:00 [非洲/突尼斯]

如上所述,將java.time對象與數據庫交換。 如果您試圖記錄歷史中的實際時刻,則數據庫列的類型應與SQL標准TIMESTAMP WITH TIME ZONE等效。

myPreparedStatement.setObject( … , zdt ) ;

…和…

LocalDateTime ldt = myResultSet.getObject( … , ZonedDateTime.class ) ;

您的驅動程序和/或數據庫可能會將此類分區值轉換為UTC值。 或者,您可以自己明確地這樣做。 提取始終位於UTC中的Instant對象。

myPreparedStatement.setObject( … , zdt.toInstant() ) ;

…和…

Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

關於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類?

  • Java SE 8Java SE 9和更高版本
    • 內置。
    • 標准Java API的一部分,具有捆綁的實現。
    • Java 9添加了一些次要功能和修復。
  • Java SE 6Java SE 7
    • java.time的許多功能在ThreeTen- Backport中都被反向移植到Java 6和7。
  • Android的
    • 更高版本的Android捆綁了java.time類的實現。
    • 對於早期的Android(<26), ThreeTenABP項目改編了ThreeTen-Backport (如上所述)。 請參閱如何使用ThreeTenABP…

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

暫無
暫無

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

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