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

SimpleDateFormat和DateTimeFormatter的区别及使用详解

目录

  • 1.简介
  • 2.区别
  • 3.SimpleDateFormat
    • 3.1 字符串转日期
    • 3.2 日期转字符串
  • 4.DateTimeFormatter
    • 4.1 字符串转日期
    • 4.2 日期转字符串
  • 扩展

1.简介

DateTimeFormatterSimpleDateFormat 都是用于格式化日期和时间的类,但是它们有一些区别。

SimpleDateFormat 是 Java 早期版本中提供的日期格式化类,他是线程不安全的。由于 SimpleDateFormat 是线程不安全的,所以如果在多线程环境中使用会出现异常,通常的解决方法要么是每个线程独立维护一份 SimpleDateFormat 对象实例,要么是将 SimpleDateFormat 放到 ThreadLocal 中。

在Java 8中新增了DateTimeFormatter 类,它比 SimpleDateFormat 更加灵活和安全。DateTimeFormatter 是不变对象,且是线程安全的。所以在使用 DateTimeFormatter 的时候,可以以静态成员变量的方式,在一个类中只维护一份对象实例,用于格式化多个日期和时间值,而无需担心线程安全问题。

2.区别

DateTimeFormatterSimpleDateFormat 都是 Java 中用于日期和时间格式化的类,但它们之间存在以下区别:

  1. 线程安全性:DateTimeFormatter 是线程安全的,而 SimpleDateFormat 不是。

  2. 类型支持:DateTimeFormatter 支持多种日期和时间类型,例如 LocalDateLocalTimeLocalDateTimeZonedDateTimeOffsetDateTime 等。而 SimpleDateFormat 只支持 Date 类型。

  3. 解析能力:DateTimeFormatter 可以将字符串解析为日期和时间类型,而 SimpleDateFormat 不支持解析操作。

  4. 本地化:DateTimeFormatter 支持本地化,可以根据不同的语言和国家的习惯格式化日期和时间。而 SimpleDateFormat 也支持本地化,但使用较为麻烦。

例如,要将日期格式化为法国本地化格式,可以使用以下代码:

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.FRANCE);
LocalDate date = LocalDate.now();
String formattedDate = date.format(formatter);
System.out.println(formattedDate);
  1. API 设计:DateTimeFormatter 提供了更加流畅的 API 设计,使用起来更加简便和易读。

总的来说,虽然 SimpleDateFormat 用于简单的日期和时间格式化是很方便的,但是 DateTimeFormatter 在灵活性、线程安全、类型支持、解析能力和本地化方面都更加强大和安全。在 Java 8 及以上的版本中,建议使用 DateTimeFormatter

3.SimpleDateFormat

SimpleDateFormat 支持一些常用的格式化选项,例如:

格式化选项描述
yyyy年份,例如 2023
MM月份,例如 05
dd日期,例如 04
HH小时(24小时制),例如 13
mm分钟,例如 30
ss秒钟,例如 45
S毫秒,例如 789
E星期几,例如 Tue
Z时区,例如 +0800

3.1 字符串转日期

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String timeStr = "2023-05-04 21:54:27";
Date date = sdf.parse(timeStr);
System.out.println(date);

输出结果为:

2023-05-04 22:15:21

如上所示,SimpleDateFormat 字符串转日期的方法主要是 parse这个方法,可以将符合定义的字符串转成 Date 类型。

3.2 日期转字符串

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date();
String formattedDate = sdf.format(now);
System.out.println(formattedDate);

输出结果为:

Thu May 04 21:54:27 CST 2023

如上所示,日期转字符串的方法是 format 可以将日期 Date类型的对象转化成字符串的日期格式来展示。

4.DateTimeFormatter

DateTimeFormatter 除了和 SimpleDateFormat 一样支持一些常用的格式化选项以外,还支持一些额外的格式化选项,例如:

格式化选项描述
uuuu年份,与 yyyy 类似,但是对于 BC 纪元来说是负数
G纪元,例如 AD 或 BC
q季度,例如 Q1
L月份,例如 1 或者

DateTimeFormatter 可以用于格式化不同的日期和时间类型,例如 LocalDateLocalTimeLocalDateTimeZonedDateTimeOffsetDateTime 等。

4.1 字符串转日期

例如,要将字符串 “2023-05-04 13:30:45” 解析为 LocalDateTime 类型,可以使用以下代码:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String dateString = "2023-05-04 13:30:45";
LocalDateTime dateTime = LocalDateTime.parse(dateString, formatter);
System.out.println(dateTime);

输出的结果的格式为:

2023-05-04T13:30:45

如上所示,使用 parse方法将字符串转化成 LocalDateTime 类型,这里是直接使用 LocalDateTime 的静态方法 parse,然后将日期的字符串和format的格式当作入参传入。

4.2 日期转字符串

例如,要将 LocalDate 格式化为 “yyyy-MM-dd” 格式的字符串,可以使用以下代码:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.now();
String formattedDate = date.format(formatter);
System.out.println(formattedDate);

输出结果为:

2023-05-04

注意:

SimpleDateFormat 的使用不同,使用 SimpleDateFormat 的时候是直接用的SimpleDateFormat的对象sdfparse或者format

而使用DateTimeFormatter 并不是直接用DateTimeFormatter 的对象来进行parse或者format。则是通过LocalDateTime.parse(dateString, formatter)来转成日期,通过LocalDate的对象date.format(formatter)来转成字符串。

扩展

类似于LocalDate 的日期类,可以通过下面的方式创建一个日期:

LocalDate newDate = LocalDate.of(2022, 1, 1);
LocalDate now = LocalDate.now();

当需要在当前日期上加减的时候,可以采用下面的方法:

Period oneMonth = Period.ofMonths(1);
newDate = newDate.plus(oneMonth);

这样newDate的日期会加上一个月。
LocalDate类中还有很多实用的静态或者普通方法,可以根据实际使用场景选择使用。

相关文章:

SimpleDateFormat和DateTimeFormatter的区别及使用详解

目录 1.简介2.区别3.SimpleDateFormat3.1 字符串转日期3.2 日期转字符串 4.DateTimeFormatter4.1 字符串转日期4.2 日期转字符串 扩展 1.简介 DateTimeFormatter 和 SimpleDateFormat 都是用于格式化日期和时间的类,但是它们有一些区别。 SimpleDateFormat 是 Jav…...

边缘人工智能——nanodet模型实践指引,从标注数据集到实现部署文件

内容概述 首先获得一个合适的nanodet模型版本,配置nanodet适用的环境,然后对网上公开的生数据集进行重新标注,配置nanodet并进行训练,.pth到.onnx的模型转化及简化,编写推理文件。 文章着重于实践方向指引,…...

SASS的用法指南

一、什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护。 本文总结了SASS的主要用法。我的目标是,有了这篇文章,日常的一般使用就不需要去…...

MCSM面板一键搭建我的世界服务器-外网远程联机【内网穿透】

文章目录 前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口 5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 转载自远程穿透文章&…...

( 数组和矩阵) 565. 数组嵌套 ——【Leetcode每日一题】

❓565. 数组嵌套 难度:中等 索引从 0 开始长度为N的数组 A,包含 0 到 N - 1 的所有整数。找到最大的集合 S并返回其大小,其中 S[i] {A[i], A[A[i]], A[A[A[i]]], ... } 且遵守以下的规则。 假设选择索引为 i 的元素 A[i] 为 S 的第一个元…...

linux内核网络子系统初探---概述

linux内核网络子系统初探—概述 一、网络模型 简单介绍 学习网络时,必定能在各种教材资料里见到以下三种网络模型: 三种模型间的差异: OSI七层模型是理论上的网络模型,从功能方面分成了相对独立的7个层次,由于太复…...

java版工程项目管理系统源代码-功能清单 图文解析

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…...

【chapter30】【PyTorch】[动量与学习率衰减】

前言: SGD的不足: ①呈“之”字型,迂回前进,损失函数值在一些维度的改变得快(更新速度快),在一些维度改变得慢(速度慢)- 在高维空间更加普遍 ②容易陷入局部极小值和鞍点…...

【键入网址到网页显示】

文章目录 HTTPDNS五层协议TCPIPMAC网卡(物理层)交换机路由器 HTTP 对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了。 http://www.server.com/dir1/file1.html http:访问数…...

Nacos配置中心、配置热更新、及配置共享的记录

Nacos除了提供了注册中心的功能,同样也提供了配置中心的功能,用于管理一些叫常改动的配置 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中…...

MATLAB | 绘图复刻(八) | 堆叠柱状图+哑铃图

本次复刻的是Nature Communications中Friedman, S.T., Muoz, M.M. A latitudinal gradient of deep-sea invasions for marine fishes. Nat Commun 14, 773 (2023). https://doi.org/10.1038/s41467-023-36501-4的Fig1图像: 复刻效果: 文章可在如下网站下…...

Scala之集合(2)

目录 集合基本函数: (1)获取集合长度 (2)获取集合大小 (3)循环遍历 (4)迭代器 (5)生成字符串 (6)是否包含 衍生集合…...

【图像分割】视觉大模型SEEM(Segment Everything Everywhere All at Once)原理解读

文章目录 摘要(效果)二、前言三、相关工作四、method4.1 多用途4.2 组合性4.3 交互式。4.4 语义感知 五、实验 论文地址:https://arxiv.org/abs/2304.06718 测试代码:https://github.com/UX-Decoder/Segment-Everything-Everywher…...

Linux: command: ibstat; infiniband

文章目录 如何在Linux上安装infiniband相关的软件。ibstat相关资料 如何在Linux上安装infiniband相关的软件。 https://access.redhat.com/solutions/301643 https://docs.oracle.com/cd/E19436-01/820-3522-10/ch3-linux.html yum groupinstall “Infiniband Support” Pack…...

UML简介与类图详解

1 UML简介 1.1 UML是什么 UML,全称为Unified Model Language,即统一建模语言,是由一整套图表组成的,为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。UML 代表了一组最佳工程实践,这些实践已被证明在…...

【每日一题】1994.好子集的数目

1994.好子集的数目 题目描述解决方案:状态压缩动态规划代码:Python 题目来源:LeetCode 原文链接:https://mp.weixin.qq.com/s/myI7_ZwJM7kizrwUtWgAZQ 难度级别:困难 题目描述 给你一个整数数组 nums。如果 nums 的一…...

坚持伙伴优先,共创数据存储新生态

4 月 26 日,2023 阿里云合作伙伴大会上,阿里巴巴集团董事会主席兼 CEO、阿里云智能集团 CEO 张勇表示,阿里云的核心定位是一家云计算产品公司,生态是阿里云的根基。让被集成说到做到的核心,是要坚定走向“产品被集成”…...

树形结构的三级分类如何实现?

概述: 本三级联动分类服务端使用的是: Springboot MyBatis-plus,前端使用的是:VueElementUI,树形控件使用的是el-tree。本三级联动分类可以把任一子项拖拽到其它目录,可以添加、编辑、删除分类。 效果图&#xff1a…...

SSM整合完整流程

🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公司实习&#x1f…...

虹科方案 | 助力高性能视频存储解决方案-2

上篇文章《虹科方案 | 助力高性能视频存储解决方案-1》我们分享了虹科&ATTO 和 Avid 共同创建协作解决方案,助力高性能视频存储,今天我们再深入介绍一下我们的案例详情。 一、行业挑战 从高端广播设施到小型独立工作室的媒体后期制作环境都需要允许多…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

day52 ResNet18 CBAM

在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...