当前位置: 首页 > news >正文

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 (LocalDateLocalDateTime 等)使用
    • 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 (LocalDateLocalDateTime 等)使用
    • 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 (LocalDateLocalDateTime 等)使用
    • 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

相关文章:

  • lc hot 100之:dummy哨兵节点创建方法
  • 每天总结一个html标签——Audio音频标签
  • 代码训练LeetCode(21)跳跃游戏2
  • rknn优化教程(一)
  • StarRocks与Apache Iceberg:构建高效湖仓一体的实时分析平台
  • 极客时间-《搞定音频技术》-学习笔记
  • 网络寻路--图论
  • R语言基础| 下载、安装
  • 图论水题2
  • 在树莓派上添加音频输入设备的几种方法
  • PyTest框架学习
  • 【读代码】从预训练到后训练:解锁语言模型推理潜能——Xiaomi MiMo项目深度解析
  • day46 python预训练模型补充
  • HTTP常见的请求方法、响应状态码、接口规范介绍
  • Elasticsearch 集群运维常用命令详解
  • Python趣学篇:用数学方程绘制浪漫爱心
  • git引用概念(git reference,git ref)(简化对复杂SHA-1哈希值的管理)(分支引用、标签引用、HEAD引用、远程引用、特殊引用)
  • Pytest+Selenium UI自动化测试实战实例
  • 力扣HOT100之二分查找:74. 搜索二维矩阵
  • 2025软件供应链安全最佳实践︱证券DevSecOps下供应链与开源治理实践
  • 下载的网站模板怎么使用/郑州百度分公司
  • 对网站的赏析/电子商务网店运营推广
  • 厦门学网站设计/雅虎搜索引擎入口
  • 个人网站用凡科建站好吗/不受限制的万能浏览器
  • 企业电子商务的网站的建设方式/bing搜索引擎国内版
  • 建网站郑州/互联网营销师怎么考