請別再使用 SimpleDateFormat 格式化時間了,DateTimeFormatter 更出色!
DateTimeFormatter類
我們先來看看SImpleDateFormat類的部分源碼,如圖1所示。
接著再來看看DateTimeFormatter類的部分源碼,如 圖2所示。
由上可知,與SimpleDateFormat不同的是,DateTimeFormatter不但是不變對象,它還是線程安全的。線程的概念我們會在后面涉及到。
現(xiàn)在我們只需要記?。阂驗?code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(60, 112, 198);">SimpleDateFormat不是線程安全的,使用的時候,只能在方法內(nèi)部創(chuàng)建新的局部變量。而DateTimeFormatter可以只創(chuàng)建一個實例,到處引用。
接下來,我們來說一說DateTimeFormatter類的常用方法
//創(chuàng)建一個格式化程序使用指定的模式
static DateTimeFormatter ofPattern(String pattern)
//創(chuàng)建一個格式化程序使用指定的模式和現(xiàn)場。
static DateTimeFormatter ofPattern(String pattern, Locale locale)
//使用此格式化程序格式的日期時間對象
String format(TemporalAccessor temporal)
其中,TemporalAccessor是一個接口,其實現(xiàn)類有LocalDate、LocalTime、LocalDateTime、ZonedDateTime等……
所以我們在使用format方法時,一般傳入其實現(xiàn)類的實例化對象即可。
接下來我們舉幾個例子。
范例1:創(chuàng)建DateTimeFormatter
package edu.blog.test07;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterTestDemo01 {
public static void main(String[] args) {
//自定義輸出格式
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
System.out.println(dtf.format(LocalDateTime.now()));
System.out.println("===================================");
//自定義格式解析
LocalDateTime localDateTime = LocalDateTime.parse("2001/07/27 22:22:22", dtf);
System.out.println(localDateTime);
}
}
/*
結(jié)果:
2021/04/02 23:14:46
===================================
2001-07-27T22:22:22
*/
由上可知,DateTimeFormatter類格式化字符串的使用方式與SImpleDateFormat一樣。
此外,另一種創(chuàng)建DateTimeFormatter的方法是,傳入格式化字符串的同時,同時指定Locale。
范例2:按照Locale默認習慣格式化
package edu.blog.test07;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class DateTimeFormatterTestDemo02 {
public static void main(String[] args) {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);
System.out.println("==============================");
DateTimeFormatter formatter01 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ZZZZ");
System.out.println(formatter01.format(zonedDateTime));
System.out.println("==============================");
DateTimeFormatter formatter02 = DateTimeFormatter.ofPattern("yyyy MMM dd EE:HH:mm", Locale.CHINA);
System.out.println(formatter02.format(zonedDateTime));
System.out.println("==============================");
DateTimeFormatter formatter03 = DateTimeFormatter.ofPattern("E, MMMM/dd/yyyy HH:mm", Locale.US);
System.out.println(formatter03.format(zonedDateTime));
}
}
/*
結(jié)果:
2021-04-02T23:27:59.326+08:00[Asia/Shanghai]
==============================
2021-04-02T23:27:GMT+08:00
==============================
2021 四月 02 星期五:23:27
==============================
Fri, April/02/2021 23:27
*/
運行本程序,分別以默認方式、中國地區(qū)和美國地區(qū)對當前時間進行顯示,結(jié)果如上所述。
在格式化字符串中,如果需要輸出固定字符,可以用’xxx’表示。
當我們直接調(diào)用"System.out.println()"對一個ZonedDateTime或者LocalDateTime實例進行打印的時候,實際上,調(diào)用的是它們的toString()方法,默認的toString()方法顯示的字符串就是按照ISO 8601格式顯示的,我們可以通過DateTimeFormatter預定義的幾個靜態(tài)變量來引用。
范例3:過DateTimeFormatter預定義靜態(tài)變量
package edu.blog.test07;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterTestDemo03 {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
System.out.println(DateTimeFormatter.ISO_DATE.format(localDateTime));
System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(localDateTime));
}
}
/*
結(jié)果:
2021-04-02T23:38:11.707
2021-04-02
2021-04-02T23:38:11.707
*/
總結(jié)
對ZonedDateTime或LocalDateTime進行格式化,需要使用DateTimeFormatter類,DateTimeFormatter可以通過格式化字符串和Locale對日期和時間進行定制輸出。
來源:blog.csdn.net/Window_mouse/article/
details/116356814?
-End-
最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!

面試題】即可獲取
