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

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

http://www.xdnf.cn/news/11974.html

相关文章:

  • OpenCV C/C++ 视频播放器 (支持调速和进度控制)
  • MySQL 事务的 ACID 四大特性及其实现原理
  • 【echarts】堆叠柱形图
  • ubuntu自定义服务自动启动
  • Python绘图库及图像类型
  • SARIMA时间序列分析:三大模型对比
  • AWS中国区IAM相关凭证自行管理策略(只读CodeCommit版)
  • 【通用技巧】使用 AI 进行技术写作:使用 AI 写作助手编写技术内容的方法
  • MySQL 核心知识点解析
  • 高防IP可以防护什么攻击类型?企业网络安全的第一道防线
  • 找到每一个单词+模拟的思路和算法
  • Elasticsearch的写入性能优化
  • 常见优化器Optimizer总结
  • 网络编程之TCP编程
  • shell脚本一步完成批量创建删除Linux用户
  • 3D动画在微信小程序的实现方法
  • C语言数据结构笔记3:Union联合体+结构体取8位Bool量
  • 109页PPT华为流程模块L1-L4级梳理及研发采购服务资产5级建模
  • 如何通过RL真正提升大模型的推理能力?NVIDIA提出长期强化学习训练框架ProRL
  • Learning a Discriminative Prior for Blind Image Deblurring论文阅读
  • nest实现前端图形校验
  • Linux磁盘管理 - RAID
  • macOS 上使用 Homebrew 安装redis-cli
  • 我们来学zookeeper -- 集群搭建
  • Monorepo架构: 项目管理模式对比与考量
  • 详解ZYNQ中的 RC 和 EP
  • 解决idea编译运行项目时间长的问题
  • 深入理解C#中的Web API:构建现代化HTTP服务的完整指南
  • Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
  • leetcode删除排序链表中的重复元素-小白初学简单解说