簡體   English   中英

將 java.util.Date 轉換為 datastax 的 LocalDate

[英]convert java.util.Date to datastax's LocalDate

我正在嘗試將yyyy-MM-dd字符串格式的日期轉換為 datastax 的 LocalDate。 我正在使用以下代碼來做到這一點。

private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

public static LocalDate getDate(String date) throws ParseException {
    Date d = DATE_FORMAT.parse(date);
    return LocalDate.fromMillisSinceEpoch(d.getTime());
}

當我測試這種方法時,我沒有得到預期的結果。

public static void main(String[] args) throws ParseException {
    System.out.println(getDate("2017-11-22"));
}
// Actual Output:
2017-11-21
// Excpected Output:
2017-11-22

有什么我在這里想念的嗎?

TL; 博士

public static LocalDate getDate(String date) {
    java.time.LocalDate jtld = java.time.LocalDate.parse(date);
    return LocalDate.fromYearMonthDay(jtld.getYear(), jtld.getMonthValue(), jtld.getDayOfMonth());
}

時間

您正在使用的 Java 日期和時間類DateSimpleDateFormat早已過時且設計不佳,尤其是后者已被證明很麻煩。 此外,現代 Java 日期和時間 API java.time提供了一個也稱為LocalDate的類,它比過時的Date類更符合您的需求。 java.time.LocalDate是一個沒有時間的日期。 因此,使用它可以完全消除導致問題的時區問題。 您的字符串2017-11-22采用 ISO 8601 格式, LocalDate將其解析為默認格式,即沒有任何顯式格式化程序,這也使您的任務更容易。

你的代碼出了什么問題?

您的SimpleDateFormat實例默認使用 JVM 的時區設置(可能是亞洲/加爾各答時間),因此將您的日期字符串解析為 Wed Nov 22 2017 00:00:00 GMT+0530 (IST),反過來與 2017 年 11 月 21 日 18:30 UTC 相同的時間點。 LocalDate.fromMillisSinceEpoch()的文檔說:“如果給定的數字不對應於整數天,它將被四舍五入到 0。” 換句話說,它四舍五入到 2017-11-21。

如果你真的堅持使用老式的SimpleDateFormat ,祝你好運(對不起,你可能需要它)。 如果是這樣,為它分配一個 UTC 時區,它將解析為一個 UTC 日期,無論 JVM 的時區設置如何,您現有的方法都將起作用。

private static final SimpleDateFormat DATE_FORMAT = buildOldfashionedDateFormatInstance();

private static SimpleDateFormat buildOldfashionedDateFormatInstance() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
    return dateFormat;
}

鏈接

類似的東西:

public static LocalDate convertDate(final String date) {
    String[] arr = date.split("-");
    if (arr.length != 3)
        return null;
    return LocalDate.fromYearMonthDay(Integer.parseInt(arr[0]),
            Integer.parseInt(arr[1]),
            Integer.parseInt(arr[2]));
}

我的第一個猜測是,由於您約會的時區,有些混亂。 要檢查這一點,只需打印結果的小時和分鍾。 如果是 2017-11-21 23:00 之類的,我不會感到驚訝

您可以通過確保日期不會因為“時區差異很小”而改變來簡單地修復它。

為了確保您的日期中的幾個小時差異不會弄亂您可以執行此操作的那一天(僅當您對日期的時間部分不感興趣時

替換:

return LocalDate.fromMillisSinceEpoch(d.getTime())

by(增加 12 小時以確保幾個小時 +/- 不會改變一天)

return LocalDate.fromMillisSinceEpoch(d.getTime()+1000*60*60*12)

暫無
暫無

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

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