2017-08-23 34 views
2

我想根據某些邏輯在Java數據庫的數據類型列中插入一個值datetime從ZonedDateTime獲取java.sql.Timestamp

邏輯: 如果月份的日期是29日,30日或31日,則在下個月的28日。其他人在下個月的同一天投入。

E.g.如果日期爲2017-08-31,則數據庫中的日期爲2017-09-28。但是,如果日期是2017-08-27,則數據庫中的日期將爲2017-09-27

我也想要一切在UTC

我想要的代碼是這樣的:

ZonedDateTime utcDateTime = ZonedDateTime.now(ZoneOffset.UTC); 

utcDateTime = utcDateTime.plusMonths(1); 

if(utcDateTime.getDayOfMonth() >= 29){ 
    utcDateTime = utcDateTime.withDayOfMonth(28); 
    Timestamp time = Timestamp.from(utcDateTime.toInstant()); 
    System.out.println(time); // DB insert here 
}else{ 
     Timestamp time = Timestamp.from(utcDateTime.toInstant()); 
     System.out.println(time); // DB insert here 
    } 

問:這是最正確的做法還是有使用Instant(它總是在UTC)一個簡單的Java 8路?我沒有辦法從Instant對象或方式中直接獲取月份中的某個月份到Instant對象。

+1

不考慮所有可能性,立即你的代碼看起來很好。 '即時'不適合你需要的日期算術,所以最好使用另一個類。我會考慮'OffsetDateTime'而不是'ZonedDateTime'。 –

+0

你需要一天中的任何時間嗎?如果不是這樣,使用LocalDate可能會更加正確(即使轉換爲Instant也不那麼簡單)。你也可能想解釋爲什麼你要回到9月28日,那時9月有30天;這似乎有點有趣? –

回答

1

您的代碼適合您的目的。爲了您可能靈感,這裏是我的版本:

OffsetDateTime utcDateTime = OffsetDateTime.now(ZoneOffset.UTC); 

    if (utcDateTime.getDayOfMonth() >= 29) { 
     utcDateTime = utcDateTime.withDayOfMonth(28); 
    } 

    utcDateTime = utcDateTime.plusMonths(1); 
    Timestamp time = Timestamp.from(utcDateTime.toInstant()); 
    System.out.println(time); // DB insert here 

我使用OffsetDateTime而不是ZonedDateTime,因爲我們不需要任何的一個時間段的額外功能,如夏令時間(DST)和歷史悠久的偏移變化。我在之後增加了一個月,調整月份。兩者都可以工作,但是這樣可以讓讀者不必考慮在1月31日增加一個月後會發生什麼。最後我發現沒有else部分的版本更自然:在某些情況下,您需要調整日期,所以if部分負責處理這個問題,而在其他所有情況下,我們都不做這種調整。把你喜歡的部分(如果有的話)丟棄,然後丟棄其餘部分。

該代碼(包括你的和我的)保留了時間。我想你想要這個。爲了完整起見,如果你不這樣做,你會希望你的數據庫來保存剛纔的日期,而不是一個時間戳,所以代碼將使用一個java.sql.Date

LocalDate utcDate = LocalDate.now(ZoneOffset.UTC); 
    if (utcDate.getDayOfMonth() > 28) { 
     utcDate = utcDate.withDayOfMonth(28); 
    } 
    utcDate = utcDate.plusMonths(1); 
    Date date = Date.valueOf(utcDate); 
    System.out.println(date); // DB insert here 

如果您不能更改數據庫列數據類型,它通常採用日(0:00)開始:

Timestamp time = Timestamp.from(utcDate.atStartOfDay(ZoneOffset.UTC).toInstant()); 
    System.out.println(time); // DB insert here 

最後,我熱烈鼓勵你看,如果你可以爲你的數據庫的JDBC驅動程序4.2。這將接受直接插入Instant(或LocalDate),所以你完全擺脫了過時的Timestamp類(或Date)。

相關問題