日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程

發布時間:2023/12/3 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java項目中的常見任務之一是將日期格式化或解析為String,反之亦然。 解析日期表示您有一個表示日期的字符串,例如“ 2017-08-3”,并且要將其轉換為表示Java中日期的對象,例如Java 8之前版本中的java.util.Date以及LocalDate或LocalDatetime在Java 8世界中。 同樣,格式化日期意味著將日期實例轉換為String,例如,您有一個Date對象或LocalDatetime對象,并且您希望使用dd-MM-yyyy格式的String。

Java 8 API為格式化和解析日期提供了很好的支持。 例如,如果您有一個日期為String的日期,例如“ 2017-08-3 12:30”,并且想要將其轉換為LocalDateTime實例,則該實例是JDK 8 Date and Time API中的新類,并且包含日期和時間部分,您該怎么做? 好了,您可以使用LocalDateTime類中的format()和parse()方法來實現這一點,但是還需要一件事,即日期格式。

在Java 8之前,您可能已經知道我們使用SimpleDateFormat和DateFormat類來表示一種格式,這存在很多問題,例如它們笨重,易變且不是線程安全的,這意味著您無法共享它們,并且每次都需要要將String轉換為Date,必須創建一個新的DateFormat對象。 盡管將SimpleDateFormat封裝到線程局部變量中確實可以緩解,但這還不夠。

JDK 8在新的DateTimeFormatter類中解決了該問題,該類可用于定義日期和時間格式,例如“ yyyy-MM-dd HH:mm”,用于指定格式的語法與我們之前在SimpleDateFormat類中使用的語法相同,但此類既是線程安全的又是不可變的,這意味著您可以在線程之間共享其實例。 理想情況下,您可以將DateTimeFormatter的引用存儲到靜態變量中以使其成為全局變量。

使用DateTimeFormatter的另一個優點是它提供了幾個內置的格式化程序,例如java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME,它可以將日期表示為
“ 2017-08-03T10:15:30”。 您可以在Javadoc中看到內置格式化程序的完整列表,也可以閱讀Really In耐心的Java SE 8以獲得更多信息。

獲得格式化程序后,解析或格式化日期就像調用方法一樣容易。 您只需要調用LocalDateTime.parse()方法即可在Java 8中將String轉換為LocalDateTime。parse()接受String并根據DateTimeFormatter指定的格式將其解析為LocalDateTime實例。 parse()方法也被重載,默認情況下它使用ISO_LOCAL_DATE_TIME格式,即“ yyyy-MM-dd HH:mm”,即“ 2017-08-03T10:15:30”,但是如果您的String格式不同,則您可以指定一個單獨的格式化程序。

因此,足夠的理論,讓我們開始真正的工作……

如何使用LocalDateTime格式化日期

假設您要從數據庫或文件中以ISO格式(例如“ yyyy-MM-dd HH:mm”)將日期作為String加載,并且要將其轉換為java.time.LocalDateTime。 以下是在Java 8中將日期字符串解析為LocalDateTime的確切步驟:

1)創建一個DateTimeFormatter對象

2)使用LocalDateTime.parse(string,formatter)方法將String轉換為LocalDatetime對象

順便說一句,在我們的情況下,日期是ISO格式,您無需創建單獨的格式化程序,就可以直接調用parse方法,如以下示例所示:

String date = "2017-03-08T12:30:54"; LocalDateTime localdatetime = LocalDateTime.parse(date);System.out.println("origional date as string: " + date); System.out.println("generated LocalDateTime: " + localdatetime);Output origional date as string: 2017-03-08T12:30:54 generated LocalDateTime: 2017-03-08T12:30:54

順便說一句,如果您的日期字符串不是parse方法期望的ISO格式,例如第二部分沒有T或缺少分鐘,則它將引發DateTimeParseException。 例如,如果要解析“ 2017-08-3 12:30”或“ 2017-03-08 12:30:54”,則它將引發以下異常:

線程“主”中的異常java.time.format.DateTimeParseException:無法在java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)的索引10處解析文本'2017-03-08T12:30:54'在Demo.main(Demo.java:22)在java.time.LocalDateTime.parse(LocalDateTime.java:492)在java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)

為避免此錯誤,您可以創建一個與您的日期字符串匹配的DateTimeFormatter實例。 例如,如果您的日期類似于“ 2017-08-3 12:30”,則可以創建一個DateTimeFormatter,如下所示:

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

之后,可以使用此格式化程序實例將String解析為LocalDateTime,如以下示例所示:

String date = "2017-03-08 12:30:54"; DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); LocalDateTime dateTime = LocalDateTime.parse(date, format);System.out.println("origional date as string: " + date); System.out.println("generated LocalDateTime: " + dateTime);Output: origional date as string: 2017-03-08 12:30 generated LocalDateTime: 2017-03-08T12:30

您可以看到沒有更多的例外,但是您必須確保日期(以字符串形式)必須與您在DateTimeFormatter實例中定義的模式匹配。 由于它也是線程安全且不可變的,因此您甚至可以將其存儲在靜態變量中,并在程序的另一部分之間共享。 您可以在上的新日期和時間API中閱讀有關線程安全性和不變性的更多信息。
Java SE 8,用于“真正不耐煩”的書。

如何使用LocalDateTime格式化日期

在上一部分中,您學習了如何解析日期,例如,將日期的String表示形式轉換為相應的對象,即Java 8中的LocalDateTime。以“ dd-MM-yyyy”格式顯示。

同樣,我們需要一個DateTimeFormatter實例來保存我們的日期模式,然后可以使用LocalDateTime類的format()方法來實現此目的。 但是,您應該記住format()是一個非靜態方法,并且需要LocalDateTime類的實例才能調用此方法。 以下是在Java 8中使用LocalDatetime格式化日期的示例:

DateTimeFormatter aFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm"); LocalDateTime localDateTime = LocalDateTime.of(2017, Month.AUGUST, 3, 12, 30); String foramttedString = localDateTime.format(aFormatter); // "2017-03-08 12:30"System.out.println("origional LocalDatetime object: " + localDateTime); System.out.println("generated string : " + foramttedString);Output: origional LocalDatetime object: 2017-08-03T12:30 generated string : 03-08-2017 12:30

您應該注意到,我們在對象上而不是在類上調用format方法,因為它是一個非靜態方法,與parse()相反,后者是靜態方法。 您還可以看到生成的字符串確認您的模式,即“ 03-08-2017 12:30”為“ dd-MM-yyyy HH:mm”格式。

Java程序在JDK 8中使用LocalDateTime格式化/解析日期

這是我們的示例Java程序,它使用Java 8中的LocalDateTime封裝了解析和格式化日期的示例。

import java.time.LocalDateTime; import java.time.Month; import java.time.format.DateTimeFormatter;/* * Java Program to parse to LocalDateTime in JDK 8. * We'll convert a String "2017-03-08 12:30" into LocalDateTime. * we'll also see how to format a LocalDateTime instance to String format. */ public class Demo {public static void main(String[] args) throws Exception {// parsing a string date to LocalDateTime String date = "2017-03-08 12:30"; DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); LocalDateTime dateTime = LocalDateTime.parse(date, format);System.out.println("origional date as string: " + date); System.out.println("generated LocalDateTime: " + dateTime);//formatting a LocalDateTime to string instance DateTimeFormatter aFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); LocalDateTime localDateTime = LocalDateTime.of(2017, Month.AUGUST, 3, 12, 30); String foramttedString = localDateTime.format(aFormatter); // "2017-03-08 12:30"System.out.println("origional LocalDatetime object: " + localDateTime); System.out.println("generated string : " + foramttedString);// be careful, string must contain date and time portion // if you are converting to LocalDateTime, or else, your // code will breakLocalDateTime dateWithoutTime = LocalDateTime.parse("2017-08-03", format); }}Output origional date as string: 2017-03-08 12:30 generated LocalDateTime: 2017-03-08T12:30 origional LocalDatetime object: 2017-08-03T12:30 generated string : 2017-08-03 12:30 Exception in thread "main" java.time.format.DateTimeParseException: Text '2017-08-03' could not be parsed at index 10 at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) at java.time.LocalDateTime.parse(LocalDateTime.java:492) at Demo.main(Demo.java:35)

重要事項

1)LocalDateTime.parse()方法用于解析,它是一個靜態方法,但是format()方法不是靜態的,并且需要LocalDateTime實例來調用。 這是parse()和format()方法之間需要注意的重要區別。 例如,LocalDateTime.format(DateTimeFromatter)在Java中是非法的,并且會給出編譯時錯誤。

2)您必須確保您的String確認您用于解析和格式化的格式,如果沒有,則parse()和format()方法都將引發DateTimeParseException,例如“線程“ main” java.time中的異?!?.format.DateTimeParseException:無法在索引10 ''處解析文本'2017-08-03' 。

3)Java 8提供了幾種內置格式,如果它達到了目的,那么應該使用相同的格式,而不是創建一個新格式。

4)由于DateTimeFormatter既是不可變的,也是線程安全的,因此建議將其存儲在靜態變量中,并在想要使用的任何人之間共享,但請確保該變量既是靜態變量又是final變量,以便線程可以讀取它但不能分配新的對其進行引用或為null,這可能會導致細微的問題。 有關更多詳細信息,請參閱我的文章有關在多線程環境中使用靜態變量的危險。

以下是在Java 8中用于將日期格式化或解析為LocalDateTime的代碼的摘要:

這就是Java 8中如何使用LocalDateTime格式化和解析日期的全部內容。 就像我說的那樣,每個新類(例如LocalDate,LocalTime和LocalDateTime)都具有解析和格式化方法,該方法可用于將字符串轉換為日期,反之亦然。 請記住,您需要一個DateTimeFormatter,其模式必須與您的日期字符串匹配,如果不匹配,則兩個parse()方法都將引發java.time.format.DateTimeParseException錯誤。

您還應該記住parse()和format()方法之間的區別,前者是靜態的,而后者是非靜態的。 您要記住的另一件事是以靜態變量的形式或利用JDK中提供的幾種內置格式器來重用DateTimeFormatter實例。 您可以進一步閱讀《真正不耐煩的Java SE 8》,以了解有關Java 8的新功能的更多信息,包括新的Date and Time API。

您可能想探索的其他Java 8日期和時間教程 :

如何在Java中比較兩個日期? ( 教程 )
如何在Java中獲取當前的時間戳值? ( 教程 )
如何在Java 8中將String轉換為LocalDateTime? ( 示例 ) 如何在JDBC中將java.util.Date轉換為java.sql.Timestamp? ( 教程 ) 如何在Java 8中將Date轉換為LocalDateTime? ( 教程 ) 如何在Java 6中獲取當前日期和時間? ( 教程 ) 如何使用JodaTime庫將String解析為Date? ( 示例 ) 如何在JDBC中將java.util.Date轉換為java.sql.Date? ( 教程 ) 如何在Java 8中將String轉換為LocalDateTime( 教程 )

感謝您到目前為止閱讀本文。 如果您喜歡Java 8日期和時間教程以及我的提示,請與您的朋友和同事分享。 如果您有任何問題或反饋,請發表評論。

翻譯自: https://www.javacodegeeks.com/2017/08/formatparse-dates-localdatetime-java-8-example-tutorial.html

總結

以上是生活随笔為你收集整理的如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。