如何在Java中將字串轉換為日期
將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
這LocalDateTime是Java中有關日期/時間的最常用的類。它代表日期和時間的組合,可以用於許多目的:
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週期同步。第一週到最後一週(包括最後一週)之間的所有星期都具有相同的週年值。因此,一週的第一天和最後一天可能具有不同的日曆年值。
注意: K和H相同的方式k和h不同。H和h分別指的是0-23和1-12的模式,而K與k分別指的是0-11和1-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”,因為它處於不同的時區。
SimpleDateFormat與DateTimeFormatter
閱讀本文,很容易提出一個問題-“有什麼區別,我應該使用哪個? ”
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與使用Java的Date / Time API非常相似:
DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss");
DateTime dateTime = DateTime.parse("22-Sep-2018 8:15:43", formatter);
Joda-Time的DateTime課程也支援時區:
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轉換為Date和Date-Time類的多種方法。其中一些方法利用了您的專案中可能已經擁有的第三方庫,而另一些方法則利用了Java提供的API來完成。
相關文章
- 如何在Java中將double轉換為int?Java
- 如何在Java 8中將List轉換為Map?Java
- JAVA字串轉日期或日期轉字串Java字串
- python字串轉換為日期時間Python字串
- Java如何將字串轉換為字元陣列?Java字串字元陣列
- php日期時間如何轉換為字串PHP字串
- 如何在MySQL中使用CONVERT將字串轉換為數字MySql字串
- 如何在 Go 中將 int 型別轉為字串Go型別字串
- Java SimpleDateFormat處理日期與字串的轉換JavaORM字串
- Java 中將 InputStream 轉換為 StreamJava
- Java 中將 Short 轉換為 byte[]Java
- 如何在Python中將語音轉換為文字Python
- 劍指offer(Java版)--將字串轉換為整數Java字串
- JavaScript將陣列轉換為字串JavaScript陣列字串
- Thymeleaf將字串轉換為數字字串
- Java 中將列表轉換為字串,並使用逗號分隔其中的元素Java字串
- Java中將 Map 轉換為 Spring MultiValueMapJavaSpring
- 如何在 Go 中將 []byte 轉換為 io.Reader?Go
- JavaScript將物件轉換為JSON格式字串JavaScript物件JSON字串
- eval()將JSON格式字串轉換為物件JSON字串物件
- SQL SERVER 日期格式化、日期和字串轉換SQLServer字串
- 在 Python 中將列表轉換為字串需要哪些技術Python字串
- {{rateTime}}大括號裡面的數字轉換為字串(日期)字串
- 將數值轉換為字串的函式字串函式
- T-SQL——將字串轉換為多列SQL字串
- Java中將 int[] 陣列 轉換為 List(ArrayList)Java陣列
- golang日期字串與時間戳轉換Golang字串時間戳
- 在Java中,你真的會日期轉換嗎Java
- JS中將一個值轉換為字串的3種方法JS字串
- 如何將 performance_schema 中的 TIMER 欄位轉換為日期時間ORM
- sqlserver資料庫日期如何格式化-日期轉換字串SQLServer資料庫字串
- Java中將電話號碼轉換為數字Java
- Java中將 Jackson JsonNode 轉換為型別化集合JavaJSON型別
- Java中將Excel轉換為JSON的兩種方法JavaExcelJSON
- 日期與字串的互相轉換SQL語句字串SQL
- java將IP地址轉換為數字以及逆向轉換Java
- MySQL把字串欄位轉換為日期型別進行比較MySql字串型別
- 將字串轉換成大寫 2020.12.28字串