DateTimeFormatter
385字约1分钟
2024-08-10
使用旧的 Date
对象时,我们用 SimpleDateFormat
进行格式化显示。使用新的 LocalDateTime
或 ZonedLocalDateTime
时,我们要进行格式化显示,就要使用 DateTimeFormatter
和 SimpleDateFormat
不同的是,DateTimeFormatter
不但是不变对象,它还是线程安全的。因为 SimpleDateFormat
不是线程安全的,使用的时候,只能在方法内部创建新的局部变量。而 DateTimeFormatter
可以只创建一个实例,到处引用
创建DateTimeFormatter时,我们仍然通过传入格式化字符串实现
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
格式化字符串的使用方式与 SimpleDateFormat
完全一致
另一种创建 DateTimeFormatter
的方法是,传入格式化字符串时,同时指定 Locale
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E, yyyy-MMMM-dd HH:mm", Locale.CHINA);
栗子
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(formatter.format(localDateTime)); // 2021-02-28 18:16:54
DateTimeFormatter zhFormatter = DateTimeFormatter.ofPattern("yyyy MMM dd EE HH:mm", Locale.CHINA);
System.out.println(zhFormatter.format(localDateTime)); // 2021 二月 28 星期日 18:17
DateTimeFormatter usFormatter = DateTimeFormatter.ofPattern("E, MMMM/dd/yyyy HH:mm", Locale.US);
System.out.println(usFormatter.format(localDateTime)); // Sun, February/28/2021 18:17
}
当我们直接调用 System.out.println()
对一个 ZonedDateTime
或者 LocalDateTime
实例进行打印的时候,实际上,调用的是它们的 toString()
方法,默认的 toString()
方法显示的字符串就是按照 ISO 8601
格式显示的,我们可以通过 DateTimeFormatter
预定义的几个静态变量来引用
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime); // 2021-02-28T18:19:51.853
System.out.println(DateTimeFormatter.ISO_DATE.format(localDateTime)); // 2021-02-28
System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(localDateTime)); // 2021-02-28T18:19:51.853
}