当前位置: 首页 > 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 共同创建协作解决方案,助力高性能视频存储,今天我们再深入介绍一下我们的案例详情。 一、行业挑战 从高端广播设施到小型独立工作室的媒体后期制作环境都需要允许多…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)​现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...