SimpleDateFormat 和 DateTimeFormatter 的异同
在Java开发中Date类型转String类型是比较常见的,其中最常用的是以下几种方式:
1. 使用SimpleDateFormat(Java 8之前)
import java.text.SimpleDateFormat;
import java.util.Date;public class DateToStringExample {public static void main(String[] args) {Date date = new Date();// 创建日期格式化对象SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期为字符串String dateString = sdf.format(date);System.out.println("格式化后的日期: " + dateString);}
}
2. 使用DateTimeFormatter(Java 8及以后)
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;public class DateToStringJava8 {public static void main(String[] args) {Date date = new Date();// 将Date转换为LocalDateTimeLocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();// 定义格式化模式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 格式化String dateString = localDateTime.format(formatter);System.out.println("格式化后的日期: " + dateString);}
}
扩展:
常用的日期格式模式
yyyy
:四位年份MM
:两位月份(01-12)dd
:两位日期(01-31)HH
:24小时制的小时(00-23)hh
:12小时制的小时(01-12)mm
:分钟(00-59)ss
:秒(00-59)SSS
:毫秒(000-999)a
:上午/下午标记(AM/PM)
注:需要注意的这两种方式虽然都可以实现需求,但是两种方式还是有比较明显的区别的
1. 所属 API 体系不同
-
SimpleDateFormat:
- 属于旧的
java.text
包 - 配合
java.util.Date
和java.util.Calendar
使用 - Java 1.1 引入
- 属于旧的
-
DateTimeFormatter:
- 属于新的
java.time.format
包 - 配合 Java 8 引入的
java.time
API (LocalDate
,LocalDateTime
等)使用 - Java 8 引入
- 属于新的
SimpleDateFormat 和 DateTimeFormatter 的区别
SimpleDateFormat
和 DateTimeFormatter
都是 Java 中用于日期时间格式化的类,但它们属于不同的 API 体系,有显著的区别:
1. 所属 API 体系不同
-
SimpleDateFormat:
- 属于旧的
java.text
包 - 配合
java.util.Date
和java.util.Calendar
使用 - Java 1.1 引入
- 属于旧的
-
DateTimeFormatter:
- 属于新的
java.time.format
包 - 配合 Java 8 引入的
java.time
API (LocalDate
,LocalDateTime
等)使用 - Java 8 引入
- 属于新的
2. 线程安全性(尤其需要注意,面试会问)
-
SimpleDateFormat:
- 不是线程安全的
- 多线程环境下需要同步或为每个线程创建独立实例
-
DateTimeFormatter:
- 线程安全
- 可以安全地在多线程环境中共享实例
3.功能差异
- DateTimeFormatter 提供更多功能:
- 内置预定义的格式化器 (如
ISO_LOCAL_DATE
) - 更好的本地化支持
- 更灵活的解析和格式化选项
- 支持解析到
TemporalAccessor
而不仅仅是特定类型
- 内置预定义的格式化器 (如
4. 异常处理
-
SimpleDateFormat:
- 解析失败时通常返回错误结果而不是抛出异常
- 行为有时不一致
-
DateTimeFormatter:
- 解析失败时抛出
DateTimeParseException
- 行为更加严格和一致
- 解析失败时抛出
5. 性能
- DateTimeFormatter 通常性能更好,特别是在多线程环境中
SimpleDateFormat 和 DateTimeFormatter 的区别
SimpleDateFormat
和 DateTimeFormatter
都是 Java 中用于日期时间格式化的类,但它们属于不同的 API 体系,有显著的区别:
1. 所属 API 体系不同
-
SimpleDateFormat:
- 属于旧的
java.text
包 - 配合
java.util.Date
和java.util.Calendar
使用 - Java 1.1 引入
- 属于旧的
-
DateTimeFormatter:
- 属于新的
java.time.format
包 - 配合 Java 8 引入的
java.time
API (LocalDate
,LocalDateTime
等)使用 - Java 8 引入
- 属于新的
2. 线程安全性
-
SimpleDateFormat:
- 不是线程安全的
- 多线程环境下需要同步或为每个线程创建独立实例
-
DateTimeFormatter:
- 线程安全
- 可以安全地在多线程环境中共享实例
3. 功能差异
- DateTimeFormatter 提供更多功能:
- 内置预定义的格式化器 (如
ISO_LOCAL_DATE
) - 更好的本地化支持
- 更灵活的解析和格式化选项
- 支持解析到
TemporalAccessor
而不仅仅是特定类型
- 内置预定义的格式化器 (如
4. 异常处理
-
SimpleDateFormat:
- 解析失败时通常返回错误结果而不是抛出异常
- 行为有时不一致
-
DateTimeFormatter:
- 解析失败时抛出
DateTimeParseException
- 行为更加严格和一致
- 解析失败时抛出
5. 性能
- DateTimeFormatter 通常性能更好,特别是在多线程环境中
6. 使用示例对比
// SimpleDateFormat 示例
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formatted = sdf.format(new Date());
Date parsed = sdf.parse("2023-11-15");// DateTimeFormatter 示例
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formatted = LocalDate.now().format(dtf);
LocalDate parsed = LocalDate.parse("2023-11-15", dtf);
何时使用哪个?
-
使用 SimpleDateFormat:
- 维护旧代码
- 必须与
java.util.Date
交互 - 项目不能使用 Java 8+
-
使用 DateTimeFormatter:
- 新开发项目
- 需要线程安全
- 需要更好的API设计和功能
- 可以使用 Java 8+
总结
DateTimeFormatter
是更现代、更安全、功能更强大的选择,而 SimpleDateFormat
主要是为了向后兼容而保留。如果使用 Java 8 或更高版本,强烈建议使用新的 java.time
API 和 DateTimeFormatter
。