簡體   English   中英

我應該使用什么Java DateTime類?

[英]What Java DateTime class should I use?

我們有一個用於生成報告的庫。 它從數據文件(SQL,XML,JSON等)讀取,然后可以在用戶編寫的等式中修改日期時間,然后將其格式化為報告輸出的指定。

等式中的使用可以添加一個時間跨度,獲取值的一部分,如“if date.month == 2”,以及Excel中的幾乎所有日期時間宏

因為數據可以是JSON(或沒有架構的XML),所以日期時間可以是“2019-01-25”,“2019-01-25T14:32:23”,“2019-01-25T14:32:23.12345”,“ 2019-01-25T14:32:23Z“,或”2019-01-25T14:32:23Z-0500“(最后兩個也可以有”.12345“)。

如果沒有時區偏移,我們假設日期時間是UTC。 雖然這應該是真的,但通常它不是,它是當地時間,但它的使用方式,無關緊要。 因此,除非指定時區偏移,否則將其設為UTC(到目前為止,我們已使用Date)。

第一個問題 - 我應該使用什么類來保持這個值? 根據我的閱讀,我認為ZonedDateTime,但也許是即時?

第二個問題 - 當我必須做3天加入日期時間時,我應該在什么課上使用?

第三個問題 - 是否有一些解析器可以解析上面列出的所有不同的字符串? 或者我需要調用String.contains()來確定格式,然后根據它做一個顯式模式? 如果是這樣,使用什么類?

第三個問題 - 是否有一些解析器可以解析上面列出的所有不同的字符串? 或者我需要調用String.contains()來確定格式,然后根據它做一個顯式模式? 如果是這樣,使用什么類?

我可能是錯誤的,但是你可以在模式和parseBest方法上使用DateTimeFormatter和可選部分:

List<String> dates = List.of(
    "2019-01-25", 
    "2019-01-25T14:32:23",
    "2019-01-25T14:32:23.12345", 
    "2019-01-25T14:32:23Z", 
    "2019-01-25T14:32:23Z-0500"
);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
   "yyyy-MM-dd['T'[HH:mm:ss][.SSSSS]][z][x]"
); // all the possible combinations

dates.forEach( date -> {
            TemporalAccessor accessor = formatter.parseBest(date,                       
       OffsetDateTime::from, // going from most specific date
       LocalDateTime::from, 
       LocalDate::from); // to the less specific 

            System.out.println( accessor.getClass() + " " + accessor);
        }

);

// output for this is 
class java.time.LocalDate 2019-01-25
class java.time.LocalDateTime 2019-01-25T14:32:23
class java.time.LocalDateTime 2019-01-25T14:32:23.123450
class java.time.OffsetDateTime 2019-01-25T14:32:23Z
class java.time.OffsetDateTime 2019-01-25T14:32:23-05:00

至於第二個問題:是的,Java JDK中有一個“timespan”類。

對於未附加到時間軸的時間跨度:

Period

表示若干天/周/月/年。 可用於日期計算,自動計算夏令時(DST)。

例如,要從給定日期減去3天,您可以這樣做

ZonedDateTime threeDaysAgo = Period.ofDays(-3).addTo(ZonedDateTime.now());

Duration

與“ Period類似,但是以天為單位(如24小時塊,而不是日歷天),小時,分鍾,秒和小數秒。

ChronoUnit

如果你需要在更大范圍內進行計算(比如包括小時/分鍾/秒等)還有ChronoUnit枚舉:

ZonedDateTime threeHoursAgo = ChronoUnit.HOURS.addTo(ZonedDateTime.now(), -3);

暫無
暫無

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

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