2016-01-27 86 views
1

我們的軟件架構師決定從我們的項目依賴項中刪除Joda時間庫並使用Java 8時間的特性。我正在研究我們的項目,並試圖找到我們使用Joda時間庫的所有地方,並確定實際使用的內容(joda LocalDateDateTime等)。
我不是喬達時庫的專家,我不是Java的8個時間方面的專家,所以我有一些問題:
在代碼中,我看到了這樣的很多地方:從Joda時間庫遷移到Java時間(Java 8)

DateTime jodaDateTime = new DateTime(); 
doSomething(jodaDateTime.toDate()); 

我是有點困惑。

Q1)這有什麼意義,在這種特殊情況下使用喬達 DateTime?我相信,我們可以只使用經典java.util.Date,我們不需要喬達:

java.util.Date date = new Date(); 
doSomething(date); 

正確?

而且,我看到這一段代碼:

org.joda.time.DateTime jodaDateTime = new DateTime(); 
org.joda.time.DateTime jodaDateTimeInPast = jodaDateTime.minusSeconds(60); 
doSomething(jodaDateTimeInPast.toDate()); 

我認爲,Java的8時API提供了一個計算,在過去的任何日期的大力支持,所以我知道如何更換一塊以上代碼到Java 8:

LocalDatetime java8DateTime = LocalDateTime.now(); 
LocaldateTime java8DateTimeInPast = java8DateTime.minusSeconds(60); 
Date java8Date = Date.from(java8DateTimeInPast.atZone(ZoneId.systemDefault()).toInstant()); 
doSomething(java8Date); 

Q2),我是用正確的方式做呢?我不確定100%。 我只是發現有一張桌子此鏈接:「Converting from Joda-Time to java.time」 還有我發現的信息,我需要使用java.time.ZonedDateTimejava.time.OffsetDateTime類,但不java.time.LocalDateTime,因爲LocalDateTime -

同樣的概念 - 日期和時間不時區

請確認我的重構是正確的(對於Q1Q2)。

回答

4

有關轉換的大部分問題應由我的blog處理。

Q1a: 創建Joda-Time對象只有將其更改回java.util.Date沒有意義。然而,該方法應該probbaly採取InstantZonedDateTime

Instant instant = Instant.now(); 
doSomething(instant); // method changed to take Instant 

注意Instant是最匹配java.util.Date

Q1b: 本案涉及時區,所以應該使用ZonedDateTime

ZonedDateTime java8DateTime = ZonedDateTime.now(); // uses ZoneId.systemDefault() 
ZonedDateTime java8DateTimeInPast = java8DateTime.minusSeconds(60); 
doSomething(java8DateTimeInPast.toInstant()); 

再次,這假定doSomething改變爲採取Instant

正確使用java.time的關鍵是要考慮每種數據的正確數據類型。

  • 只是約會嗎?然後使用LocalDate
  • 只是一次?然後使用LocalTime
  • 日期,時間和時區?然後使用ZonedDateTime
  • 只是一個沒有其他信息的時間戳嗎?然後使用Instant
  • 帶偏移量(不是區域)的網絡日期時間格式?然後使用OffsetDateTime
+0

您寫道:「即時與java.util.Date最接近匹配」,但是例如:new Date()。toString()返回:Thu Jan 28 18:26:27 EET 2016,但Instant.now()。 toString()返回:2016-01-28T16:26:27.210Z。正如你所見,即時返回16:26:27這是UTC,日期返回18:26:27 - EET – user471011

+2

'java.util.Date'上的'toString()'返回本地時區的時間。但是對象的狀態並不適用於此。瞭解這種差異是理解java.util.Date的關鍵。 – JodaStephen

2

您對兩種情況都適用。唯一的意見我可能會補充說,Java 8的時間取代java.util.Date,所以你可能想要考慮用doSomething(java.time.temporal.TemporalAccessor)替換你的方法doSomething(java.util.Date)。但是,java.util.Date尚未被聲明爲depricated,因此您不必。根據我的經驗,java 8時間包是非常靈活和全面的包。我發現了喬達的一些有趣的錯誤,儘管喬達當時是一個很好的包裝。

+3

'TemporalAccessor'不應該在大多數應用程序代碼中使用。一般來說,如果您在最底層的庫之外使用它,那麼您做錯了什麼。在這種情況下,它應該是'doSomething(Instant)'或'doSomething(ZonedDateTime)'或類似 – JodaStephen

+0

@JodaStephen,其他所有的觀點都是正確的? – user471011