如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程
Java項(xiàng)目中的常見任務(wù)之一是將日期格式化或解析為String,反之亦然。 解析日期表示您有一個(gè)表示日期的字符串,例如“ 2017-08-3”,并且要將其轉(zhuǎn)換為表示Java中日期的對(duì)象,例如Java 8之前版本中的java.util.Date以及LocalDate或LocalDatetime在Java 8世界中。 同樣,格式化日期意味著將日期實(shí)例轉(zhuǎn)換為String,例如,您有一個(gè)Date對(duì)象或LocalDatetime對(duì)象,并且您希望使用dd-MM-yyyy格式的String。
Java 8 API為格式化和解析日期提供了很好的支持。 例如,如果您有一個(gè)日期為String的日期,例如“ 2017-08-3 12:30”,并且想要將其轉(zhuǎn)換為L(zhǎng)ocalDateTime實(shí)例,則該實(shí)例是JDK 8 Date and Time API中的新類,并且包含日期和時(shí)間部分,您該怎么做? 好了,您可以使用LocalDateTime類中的format()和parse()方法來實(shí)現(xiàn)這一點(diǎn),但是還需要一件事,即日期格式。
在Java 8之前,您可能已經(jīng)知道我們使用SimpleDateFormat和DateFormat類來表示一種格式,這存在很多問題,例如它們笨重,易變且不是線程安全的,這意味著您無法共享它們,并且每次都需要要將String轉(zhuǎn)換為Date,必須創(chuàng)建一個(gè)新的DateFormat對(duì)象。 盡管將SimpleDateFormat封裝到線程局部變量中確實(shí)可以緩解,但這還不夠。
JDK 8在新的DateTimeFormatter類中解決了該問題,該類可用于定義日期和時(shí)間格式,例如“ yyyy-MM-dd HH:mm”,用于指定格式的語法與我們之前在SimpleDateFormat類中使用的語法相同,但此類既是線程安全的又是不可變的,這意味著您可以在線程之間共享其實(shí)例。 理想情況下,您可以將DateTimeFormatter的引用存儲(chǔ)到靜態(tài)變量中以使其成為全局變量。
使用DateTimeFormatter的另一個(gè)優(yōu)點(diǎn)是它提供了幾個(gè)內(nèi)置的格式化程序,例如java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME,它可以將日期表示為
“ 2017-08-03T10:15:30”。 您可以在Javadoc中看到內(nèi)置格式化程序的完整列表,也可以閱讀Really In耐心的Java SE 8以獲得更多信息。
獲得格式化程序后,解析或格式化日期就像調(diào)用方法一樣容易。 您只需要調(diào)用LocalDateTime.parse()方法即可在Java 8中將String轉(zhuǎn)換為L(zhǎng)ocalDateTime。parse()接受String并根據(jù)DateTimeFormatter指定的格式將其解析為L(zhǎng)ocalDateTime實(shí)例。 parse()方法也被重載,默認(rèn)情況下它使用ISO_LOCAL_DATE_TIME格式,即“ yyyy-MM-dd HH:mm”,即“ 2017-08-03T10:15:30”,但是如果您的String格式不同,則您可以指定一個(gè)單獨(dú)的格式化程序。
因此,足夠的理論,讓我們開始真正的工作……
如何使用LocalDateTime格式化日期
假設(shè)您要從數(shù)據(jù)庫或文件中以ISO格式(例如“ yyyy-MM-dd HH:mm”)將日期作為String加載,并且要將其轉(zhuǎn)換為java.time.LocalDateTime。 以下是在Java 8中將日期字符串解析為L(zhǎng)ocalDateTime的確切步驟:
1)創(chuàng)建一個(gè)DateTimeFormatter對(duì)象
2)使用LocalDateTime.parse(string,formatter)方法將String轉(zhuǎn)換為L(zhǎng)ocalDatetime對(duì)象
順便說一句,在我們的情況下,日期是ISO格式,您無需創(chuàng)建單獨(dú)的格式化程序,就可以直接調(diào)用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或缺少分鐘,則它將引發(fā)DateTimeParseException。 例如,如果要解析“ 2017-08-3 12:30”或“ 2017-03-08 12:30:54”,則它將引發(fā)以下異常:
線程“主”中的異常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)
為避免此錯(cuò)誤,您可以創(chuàng)建一個(gè)與您的日期字符串匹配的DateTimeFormatter實(shí)例。 例如,如果您的日期類似于“ 2017-08-3 12:30”,則可以創(chuàng)建一個(gè)DateTimeFormatter,如下所示:
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");之后,可以使用此格式化程序?qū)嵗龑tring解析為L(zhǎng)ocalDateTime,如以下示例所示:
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 您可以看到?jīng)]有更多的例外,但是您必須確保日期(以字符串形式)必須與您在DateTimeFormatter實(shí)例中定義的模式匹配。 由于它也是線程安全且不可變的,因此您甚至可以將其存儲(chǔ)在靜態(tài)變量中,并在程序的另一部分之間共享。 您可以在上的新日期和時(shí)間API中閱讀有關(guān)線程安全性和不變性的更多信息。
Java SE 8,用于“真正不耐煩”的書。
如何使用LocalDateTime格式化日期
在上一部分中,您學(xué)習(xí)了如何解析日期,例如,將日期的String表示形式轉(zhuǎn)換為相應(yīng)的對(duì)象,即Java 8中的LocalDateTime。以“ dd-MM-yyyy”格式顯示。
同樣,我們需要一個(gè)DateTimeFormatter實(shí)例來保存我們的日期模式,然后可以使用LocalDateTime類的format()方法來實(shí)現(xiàn)此目的。 但是,您應(yīng)該記住format()是一個(gè)非靜態(tài)方法,并且需要LocalDateTime類的實(shí)例才能調(diào)用此方法。 以下是在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您應(yīng)該注意到,我們?cè)趯?duì)象上而不是在類上調(diào)用format方法,因?yàn)樗且粋€(gè)非靜態(tài)方法,與parse()相反,后者是靜態(tài)方法。 您還可以看到生成的字符串確認(rèn)您的模式,即“ 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)重要事項(xiàng)
1)LocalDateTime.parse()方法用于解析,它是一個(gè)靜態(tài)方法,但是format()方法不是靜態(tài)的,并且需要LocalDateTime實(shí)例來調(diào)用。 這是parse()和format()方法之間需要注意的重要區(qū)別。 例如,LocalDateTime.format(DateTimeFromatter)在Java中是非法的,并且會(huì)給出編譯時(shí)錯(cuò)誤。
2)您必須確保您的String確認(rèn)您用于解析和格式化的格式,如果沒有,則parse()和format()方法都將引發(fā)DateTimeParseException,例如“線程“ main” java.time中的異常” .format.DateTimeParseException:無法在索引10 ''處解析文本'2017-08-03' 。
3)Java 8提供了幾種內(nèi)置格式,如果它達(dá)到了目的,那么應(yīng)該使用相同的格式,而不是創(chuàng)建一個(gè)新格式。
4)由于DateTimeFormatter既是不可變的,也是線程安全的,因此建議將其存儲(chǔ)在靜態(tài)變量中,并在想要使用的任何人之間共享,但請(qǐng)確保該變量既是靜態(tài)變量又是final變量,以便線程可以讀取它但不能分配新的對(duì)其進(jìn)行引用或?yàn)閚ull,這可能會(huì)導(dǎo)致細(xì)微的問題。 有關(guān)更多詳細(xì)信息,請(qǐng)參閱我的文章有關(guān)在多線程環(huán)境中使用靜態(tài)變量的危險(xiǎn)。
以下是在Java 8中用于將日期格式化或解析為L(zhǎng)ocalDateTime的代碼的摘要:
這就是Java 8中如何使用LocalDateTime格式化和解析日期的全部?jī)?nèi)容。 就像我說的那樣,每個(gè)新類(例如LocalDate,LocalTime和LocalDateTime)都具有解析和格式化方法,該方法可用于將字符串轉(zhuǎn)換為日期,反之亦然。 請(qǐng)記住,您需要一個(gè)DateTimeFormatter,其模式必須與您的日期字符串匹配,如果不匹配,則兩個(gè)parse()方法都將引發(fā)java.time.format.DateTimeParseException錯(cuò)誤。
您還應(yīng)該記住parse()和format()方法之間的區(qū)別,前者是靜態(tài)的,而后者是非靜態(tài)的。 您要記住的另一件事是以靜態(tài)變量的形式或利用JDK中提供的幾種內(nèi)置格式器來重用DateTimeFormatter實(shí)例。 您可以進(jìn)一步閱讀《真正不耐煩的Java SE 8》,以了解有關(guān)Java 8的新功能的更多信息,包括新的Date and Time API。
您可能想探索的其他Java 8日期和時(shí)間教程 :
如何在Java中比較兩個(gè)日期? ( 教程 )
如何在Java中獲取當(dāng)前的時(shí)間戳值? ( 教程 )
如何在Java 8中將String轉(zhuǎn)換為L(zhǎng)ocalDateTime? ( 示例 ) 如何在JDBC中將java.util.Date轉(zhuǎn)換為java.sql.Timestamp? ( 教程 ) 如何在Java 8中將Date轉(zhuǎn)換為L(zhǎng)ocalDateTime? ( 教程 ) 如何在Java 6中獲取當(dāng)前日期和時(shí)間? ( 教程 ) 如何使用JodaTime庫將String解析為Date? ( 示例 ) 如何在JDBC中將java.util.Date轉(zhuǎn)換為java.sql.Date? ( 教程 ) 如何在Java 8中將String轉(zhuǎn)換為L(zhǎng)ocalDateTime( 教程 )
感謝您到目前為止閱讀本文。 如果您喜歡Java 8日期和時(shí)間教程以及我的提示,請(qǐng)與您的朋友和同事分享。 如果您有任何問題或反饋,請(qǐng)發(fā)表評(píng)論。
翻譯自: https://www.javacodegeeks.com/2017/08/formatparse-dates-localdatetime-java-8-example-tutorial.html
總結(jié)
以上是生活随笔為你收集整理的如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发票专用章不备案后果是什么(发票专用章不
- 下一篇: linux含义是什么(linux $