簡體   English   中英

這個 java 日期格式化程序有什么問題?

[英]What is wrong with this java date formatter?

我正在嘗試將您在下面的代碼中看到的日期格式化為字符串,以便能夠將其作為 LocalDateTime object,但我遇到了一個例外,我正在遵循本指南https://mkyong.com /java8/java-8-how-to-convert-string-to-localdate/ ,但不幸的是它沒有像我下面的日期這樣的例子,有人可以幫我看看嗎? 我真的很感激:)

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE MMM d hh:mm:ss zzz yyyy",   Locale.US);
String date = "Wed Nov 18 00:00:00 COT 2020";
LocalDateTime localDateTime = LocalDateTime.parse(date, formatter);
System.out.println(localDateTime);
System.out.println(formatter.format(localDateTime));

我正進入(狀態:

java.time.format.DateTimeParseException:無法在索引 0 處解析文本“Wed Nov 18 00:00:00 COT 2020”

如果您想使用 Zones 進行往返解析/格式化,請嘗試

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy",   Locale.US);
    String date = "Wed Nov 18 00:00:00 COT 2020";
    ZonedDateTime localDateTime = ZonedDateTime.parse(date, formatter);
    System.out.println(localDateTime);
    System.out.println(formatter.format(localDateTime));

要回答標題中提出的問題,這個 Java 日期格式化程序有什么問題?

  • EEEE是一周中一天的全名,如Monday 對於Mon這樣的縮寫,您需要EEEEEE
  • 正如其他人所說,小寫hh是上午或下午從0112的時鍾小時,因此無法解析您的小時00 即使可以,它也無法在一天中的時間提供足夠的信息。 對於從0023的一天中的一小時,您需要大寫HH
  • Basil Bourque 在評論中已經提到了一個更基本的問題:解析像COT這樣的時區縮寫的結果通常是未定義的。 雖然COT可能只有一個定義,但我不知道,大多數最常見的縮寫都是模棱兩可的,你不知道解析它們會得到什么。
  • 如前所述,您的格式化程序不能用於格式化LocalDateTime LocalDateTime沒有任何時區。 格式化程序需要時區縮寫的時區名稱zzz 您可以格式化ZonedDateTime ,或者您可以使用其withZone方法修改格式化程序以具有覆蓋區域。

提示:當您不知道解析失敗的原因時,請嘗試使用相同的格式化程序格式化預期值,並將結果與您嘗試解析的字符串進行比較。 大多數情況下,差異會引導您走上正確的道路。 像這樣:

    ZonedDateTime val = ZonedDateTime.of(
            2020, 11, 18, 0, 0, 0, 0, ZoneId.of("America/Bogota"));
    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("EEEE MMM d hh:mm:ss zzz yyyy", Locale.US);
    String toBeParsed = "Wed Nov 18 00:00:00 COT 2020";
    String formatted = val.format(formatter);
    System.out.println("String to be parsed: " + toBeParsed);
    System.out.println("Formatted string:    " + formatted);

Output:

 String to be parsed: Wed Nov 18 00:00:00 COT 2020 Formatted string: Wednesday Nov 18 12:00:00 COT 2020

區別是Wednesday12 ,所以模式中的錯誤似乎在EEEEhh

您的字符串似乎來自過時的java.util.Date class 的toString方法。 要從那里解析字符串,請參閱底部鏈接的答案之一。 或者更好的是,獲取Date object,使用其toInstant方法將其轉換為現代Instant並從那里執行任何進一步的轉換。 或者更好的是,完全停止使用Date

鏈接

如何解析Date.toString()的結果:

暫無
暫無

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

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