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
}