[英]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
這樣的縮寫,您需要E
、 EE
或EEE
。hh
是上午或下午從01
到12
的時鍾小時,因此無法解析您的小時00
。 即使可以,它也無法在一天中的時間提供足夠的信息。 對於從00
到23
的一天中的一小時,您需要大寫HH
。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
區別是Wednesday
和12
,所以模式中的錯誤似乎在EEEE
和hh
。
您的字符串似乎來自過時的java.util.Date
class 的toString
方法。 要從那里解析字符串,請參閱底部鏈接的答案之一。 或者更好的是,獲取Date
object,使用其toInstant
方法將其轉換為現代Instant
並從那里執行任何進一步的轉換。 或者更好的是,完全停止使用Date
。
如何解析Date.toString()
的結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.