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.pswp.cn/web/82517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《前端面试题:CSS对浏览器兼容性》

CSS浏览器兼容性完全指南:从原理到实战 跨浏览器兼容性是前端开发的核心挑战,也是面试中的高频考点。查看所有css属性对各个浏览器兼容网站:https://caniuse.com 一、浏览器兼容性为何如此重要? 在当今多浏览器生态中&#xff0c…

【stm32开发板】单片机最小系统原理图设计

一、批量添加网络标签 可以选择浮动工具中的N,单独为引脚添加网络标签。 当芯片引脚非常多的时候,选中芯片,右键选择扇出网络标签/非连接标识 按住ctrl键即可选中多个引脚 点击将引脚名称填入网络名 就完成了引脚标签的批量添加 二、电源引…

golang连接sm3认证加密(app)

文章目录 环境文档用途详细信息 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:4.5 文档用途 golang连接安全版sm3认证加密数据库,驱动程序详见附件。 详细信息 1.下载Linux golang安装包 go1.17.3.linux-amd64.tar.gz 1.1. 解压安…

node实例应用

打开vscode,创建node项目,直接进入一个干净的文件夹,打开控制台 一 项目初始化 1. 初始化包管理 npm init -y2. 安装express npm install express4.17.1 3. 根目录下创建app.js,引入express // 引入expree const express require(express)// 创建实例 const …

Springboot——整合websocket并根据type区别处理

文章目录 前言架构思想项目结构代码实现依赖引入自定义注解定义具体的处理类定义 TypeAWebSocketHandler定义 TypeBWebSocketHandler 定义路由处理类配置类,绑定point制定前端页面编写测试接口方便跳转进入前端页面 测试验证结语 前言 之前写过一篇类似的博客&…

vscode命令行debug

vscode命令行debug 一般命令行debug会在远程连服务器的时候用上,命令行debug的本质是在执行时暴露一个监听端口,通过进入这个端口,像本地调试一样进行。 这里提供两种方式: 直接在命令行中添加debugpy,适用于python…

Hot100 Day02(移动0,乘最多水的容器、三数之和、接雨水)

移动零 题目链接 题目描述: 思路:上述蓝色箭头代表当前遍历的元素,红色数字则是当前空位0的位置,每一次遇到非0元素,就是讲该元素的位置和空位0的位置进行交换,同时空位0的下标1. 代码 class Solution …

(eNSP)配置WDS手拉手业务

1.实验拓扑 2.基础配置 [SW1]dis cu # sysname SW1 # vlan batch 10 100 110 120 # dhcp enable # interface Vlanif10ip address 192.168.10.2 255.255.255.0 # interface Vlanif100ip address 192.168.100.2 255.255.255.0dhcp select interfacedhcp server excluded-ip-add…

lua的笔记记录

类似python的eval和exec 可以伪装成其他格式的文件,比如.dll 希望在异常发生时,能够让其沉默,即异常捕获。而在 Lua 中实现异常捕获的话,需要使用函数 pcall,假设要执行一段 Lua 代码并捕获里面出现的所有错误&#xf…

【DeepSeek】【Dify】:用 Dify 对话流+标题关键词注入,让 RAG 准确率飞跃

1 构建对话流处理数据 初始准备 文章大纲摘要 数据标注和清洗 代码执行 特别注解 2 对话流测试 准备工作 大纲生成 清洗片段 整合分段 3 构建知识库 构建 召回测试 4 实战应用测试 关键词提取 智能总结 测试 1 构建对话流处理数据 初始准备 构建对话变量 用…

RabbitMQ 开机启动配置教程

RabbitMQ 开机启动配置教程 在本教程中,我们将详细介绍如何配置 RabbitMQ 以实现开机自动启动。此配置适用于手动安装的 RabbitMQ 版本。 环境准备 操作系统:CentOS 7RabbitMQ 版本:3.8.4Erlang 版本:21.3 步骤 1. 安装 Erla…

第N1周:one-hot编码案例

🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 一、one-hot编码概念 自然语言处理(NLP)中的文本数字化:文字对于计算机来说就仅仅只是一个个符号,计算…

Linux 云服务器部署 Flask 项目(含后台运行与 systemd 开机自启)

一、准备工作 在开始正式部署之前,请确认以下前提条件已经准备好: 你有一台运行 Linux 系统(CentOS 或 Ubuntu)的服务器; 服务器有公网 IP,本例中使用:111.229.204.102; 你拥有该服务器的管理员权限(可以使用 sudo); 打算使用 Flask 构建一个简单的 Web 接口; 服务…

散货拼柜业务:多货主财务结算如何高效管理?

散货拼柜业务满足了小批量发货客户的需求,由于无法满足海运整柜的条件,其模式通常涉及多个货主共同分摊同一集装箱的运输项目。这种业务模型虽然在成本上具备优势,但其复杂的财务结算过程往往给公司带来了挑战。 散货拼柜业务的特点在于其小…

数据结构(7)—— 二叉树(1)

目录 前言 一、 树概念及结构 1.1树的概念 1.2树的相关概念 1.3数的表示 1.二叉树表示 2.孩子兄弟表示法 3.动态数组存储 1.4树的实际应用 二、二叉树概念及结构 2.1概念 2.2特殊的二叉树 1.满二叉树 2. 完全二叉树 2.3二叉树的性质 2.4二叉树的存储结构 1.顺序存储 2.链式存储…

SpringBoot+Vue+微信小程序校园自助打印系统

概述​​ 校园自助打印系统是现代化校园建设中不可或缺的一部分,基于SpringBootVue微信小程序开发的​​免费Java源码​​项目,包含完整的用户预约、打印店管理等功能模块。 ​​主要内容​​ ​​ 系统功能模块​​ ​​登录验证模块​​:…

使用 useSearchParams 的一个没有触发控制台报错的错误用法

const searchParams useSearchParams(); // navigate(/?${searchParams.toString()});//带过去的参数会把函数方法也带过去 正确写法应该是用[]解构 使用了数组解构(destructuring)来提取 useSearchParams 返回的数组中的第一个值 const [searchPara…

Blender的一些设置

1. 将Blender长度单位改为毫米(mm), 并设置guides Grid的缩放系数,避免网格不见了。 2. 布尔操作的(Apply)应用按钮在哪里?好吧,在这里: 可以按下 CTRL A 快捷键。 3. 模型的 移动、旋转、缩放快捷键: G,R&#xff0…

Inno Setup 脚本中常用术语释义

1、目录常量 {app} 应用程序所在的目录。 {win} 系统的 Windows 目录, “C:/WINDOWS”。 {sys} 系统的 Windows 系统(System)目录,“C:/WINDOWS/SYSTEM”。 {src} 这个文件夹指向安装程序所在的位置。 {pf} 程序…

【java面试】MySQL篇

MySQL篇 一、总体结构二、优化(一)定位慢查询1.1 开源工具1.2Mysql自带的慢日志查询1.3 总结 (二)定位后优化2.1 优化2.2 总结 (三)索引3.1 索引3.2 索引底层数据结构——B树3.3 总结 (四&#…