如何在Java中將字串轉換為日期

allway2發表於2021-01-01

Java(或任何程式語言)中的字串轉換為日期是一項基本技能,對於在專案上進行工作很有用。有時,使用字串表示日期,然後將其轉換為Date物件以供進一步使用是更容易的。

在本文中,我們將介紹許多可用於將Java字串轉換為日期物件的方法和庫。

日期/時間API

Java中的日期/時間API預設情況下使用ISO 8601格式(yyyy-MM-dd)

預設情況下,所有日期都遵循此格式,如果您使用預設格式器,則所有轉換後的字串都必須遵循該格式。

parse()

API定義了一種parse()方法,該方法接受字元序列並使用ISO_LOCAL_DATE格式來解析輸入:

parse(CharSequence);

另外,您可以使用此方法的兩個引數的變體,定義一個不同的格式化程式:

parse(CharSequence, DateTimeFormatter);

DateTimeFormatter用於在新的日期/時間API中格式化和解析日期時間物件。此API中的所有日期時間類都包含一種用於解析和格式化的方法,其中每個方法都接受DateTimeFormatter來定義模式。

將字串轉換為LocalDate

LocalDate表示日期,沒有ISO-8601格式的時間。

它與Date以下事實的不同之處在於,它不將時間儲存為自紀元以來的毫秒偏移量,而只是儲存當前日期。它也是Date / Time API的較新實現,並提供了自己的格式/解析方法,以及日,周和年的加減法,這在Date變體中不存在。

要將字串轉換為LocalDate物件,只需編寫以下程式碼:

LocalDate date = LocalDate.parse("2018-09-16");

這等效於編寫處理程式碼以例項化LocalDate物件:

LocalDate date = LocalDate.of(2018, 09, 16);

將字串轉換為LocalTime

LocalTime代表時間,不帶ISO-8601格式的時區。它不儲存自曆元以來的偏移時間,而是提供納秒級精度。

LocalDate一樣,它提供了許多內建的非常有用的解析和格式化方法,以及從中新增或減去時間的方法。

要將字串轉換為LocalTime物件,只需編寫以下程式碼:

LocalTime localTime = LocalTime.parse("8:00");

這等效於編寫處理程式碼以例項化LocalTime物件:

LocalTime localTime = LocalTime.of(8, 00);

將字串轉換為LocalDateTime

LocalDateTimeJava中有關日期/時間的最常用的類。它代表日期和時間的組合,可以用於許多目的:

LocalDateTime localDateTime = LocalDateTime.parse("2018-09-16T08:00:00");

乍一看,這種格式可能令人困惑,但實際上非常簡單:

時間標記僅表示格式的LocalDate和之間的一條線LocalTime

您還可以輕鬆地將其格式化LocalDateTime為更具可讀性的格式:

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

String formatDateTime = localDateTime.format(formatter);

執行這段程式碼並列印formatDateTime將產生:

2018-09-16 08:00:00

您通常會這樣做,以便在LocalDateTime事先對物件執行操作的同時以字串格式向終端使用者顯示結果。

將字串轉換為ZonedDateTime

根據要處理的專案,在處理日期和時間時,可能需要處理不同的時區。

將字串轉換為ZonedDateTime物件很簡單:

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2018-09-16T08:00:00+00:00[Europe/London]");

上面的示例顯示瞭如何初始化ZonedDateTime倫敦的。

使用自定義格式化程式轉換字串

有時,我們可能希望使用我們自己的自定義格式化程式,該格式化程式以多種方式接受字串,但仍然不會丟擲DateTimeParseException

這是您將使用的一些最常見的模式:

窗體底端

  • y:年(2018,18)
  • M:一年中的一個月(08年8月,8月)
  • d:一個月中的某天(1、5、25)
  • E:一週中一天的名稱(週一,週六)
  • a:前子午/後子午標記(AM,PM)
  • H:24小時制的小時(1、7、14、21)
  • h:12小時風格的小時(1、5、12)
  • m:一小時內的分鐘數(1、25、54)
  • s:一分鐘內的秒數(1、25、54)

還有一些您可能不會經常使用:

  • G:時代代號(AD,CE)
  • Y:週年(2018,18)
  • w:一年中的一週(25,53)
  • W:一個月中的一週(2)
  • D:一年中的一天(254)
  • F:一個月中的星期幾(3)
  • E:一週中的日期名稱(星期一,星期一)
  • u:一週的天數(1、4)
  • k:一天中的小時(17)
  • K:一天中的AM / PM小時(5)
  • S:毫秒(1245)
  • z:一般時區(太平洋標準時間;太平洋標準時間; GMT-8:00)
  • Z:RFC 822時區(-0800)
  • X:ISO 8601時區(-08,-0800,-8:00)

注意:週年與年份不同-週年與WEEK_OF_YEAR週期同步。第一週到最後一週(包括最後一週)之間的所有星期都具有相同的週年值。因此,一週的第一天和最後一天可能具有不同的日曆年值。

注意: KH相同的方式kh不同。Hh分別指的是0-231-12的模式,而Kk分別指的是0-111-24

如果仍然不能滿足您對自定義格式器的需求,則可以使用DateTimeFormatterBuilder來構建非常具體且複雜的格式器。除其他外,DateTimeFormatter是使用此類構建的。

java.util.Date

這是一種較舊的方法,如今已不常用,但仍然值得一提,因為有時我們仍使用這些API中的類:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");

 

Date date = formatter.parse("22-Sep-2018");

我們可以將許多模式傳遞給的建構函式SimpleDateFormat。您可以使用可用的模式來組合幾乎任何數量的格式。

無法為日期設定時區,因為它根本不包含此類資訊。但是,很容易格式化日期並將時區資訊新增到字串中:

SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");

formatter.setTimeZone(TimeZone.getTimeZone("UTC"));

 

Date date = formatter.parse("22-09-2018 08:23:43 PM");

String formattedDate = formatter.format(date);

 

System.out.println(date);

System.out.println(formattedDate);

執行這段程式碼將產生:

Sat Sep 22 22:23:43 CEST 2018

22-9-2018 08:23:43 PM

“ 22:23:43 CEST”對應於“ 10:23:43 PM”時間,而格式化日期則代表“ 8:23:43 PM”,因為它處於不同的時區。

SimpleDateFormatDateTimeFormatter

閱讀本文,很容易提出一個問題-“什麼區別,我應該使用哪個? ”

DateTimeFormatter已在Java 8中用新的Date / Time API新增,並替換了較舊的,現在已不常用的SimpleDateFormat。與舊版本不同,它是執行緒安全的,並提供新功能:

// SimpleDateFormat

SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy");

Date date = new Date();

String formattedDate = formatter.format(date);

Date parsedDate = formatter.parse(formattedDate);

 

// DateTimeFormatter

LocalDate date = LocalDate.now();

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-M-yyyy");

String formattedDate = date.format(formatter);

LocalDate parsedDate = LocalDate.parse(formattedDate, formatter); 

很明顯看到這兩者之間的區別。在較舊的方式中,格式化程式用於格式化然後解析日期。以更新的方式,日期具有其自己的格式和解析方法,並且DateTimeFormatter僅將模式用作模式。

如果您正在使用Java 8和新API,請使用DateTimeFormatter,而如果您仍在使用Java的舊版本,請使用SimpleDateFormat

喬達時代

開發Joda-Time是為了解決舊的Java時間和日期類的問題。

Java 8開始,這些問題已得到糾正,並且Joda-Time已達到其目的。甚至它的作者都建議遷移到官方,java.time以便確定日期和時間。

如果這是不可能的,並且對於仍然使用Java 8之前的Java版本的使用者,Joda-Time仍然是一個不錯的庫。

該庫的依賴項可以通過Maven依賴項輕鬆新增:

<dependency>

    <groupId>joda-time</groupId>

    <artifactId>joda-time</artifactId>

    <version>{version}</version>

</dependency>

使用Joda-Time與使用JavaDate / Time API非常相似:

DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss");

 

DateTime dateTime = DateTime.parse("22-Sep-2018 8:15:43", formatter);

Joda-TimeDateTime課程也支援時區:

DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss");

 

DateTime dateTime = DateTime.parse("22-Sep-2018 8:15:43", formatter);

DateTime dateTimeZoned = dateTime.withZone(DateTimeZone.forID("Europe/London));

有關可用的時區ID的完整列表,請訪問官方文件

Apache Commons

Apache Commons是許多專案中使用的有用庫。

要將這個庫新增到您的專案中,可以使用Maven依賴項:

<dependency>

    <groupId>org.apache.commons</groupId>

    <artifactId>commons-lang3</artifactId>

    <version>{version}</version>

</dependency>

以下兩種實現都接受一系列模式。這些方法將依次解析每個模式。如果沒有模式與輸入字串匹配,ParseException則丟擲a

使用DateTimeConverter

DateTimeConverter dtc = new DateConverter();

dtc.setPatterns(new String[] { "yyyy-MM-dd", "yyyy-MM-dd hh:mm:ss" });

ConvertUtils.register(dtc, Date.class);

使用DateUtils

Date date = DateUtils.parseDate("22-Sep-2018", String[] {"dd-MM-yyyy HH:mm:ss", "dd-MM-yyyy"});

結論

我們已經介紹了將Java中的簡單String轉換為DateDate-Time類的多種方法。其中一些方法利用了您的專案中可能已經擁有的第三方庫,而另一些方法則利用了Java提供的API來完成。

 

相關文章