请别再使用SimpleDateFormat了,用DateTimeFormatter吧!

Date、SimpleDateFormat和LocalDate、LocalTime、LocalDateTime、ZonedDateTime、DateTimeFormatter的使用和区别 java1.8引入的新特性中,其中就含有对日期时间的处理,下面我们一起学习和了解。 阅读详情

DateTimeFormatter类

之前我们在《听说你还在用Date类表示时间?》)这篇文章中已经有接触过这个类了,使用旧的Date对象时,我们用SimpleDateFormat进行格式化显示。使用新的LocalDateTime或ZonedLocalDateTim时,我们要进行格式化显示,就要使用DateTimeFormatter。

我们先来看看SImpleDateFormat类的部分源码,如图 1所示。

图 1

接着再来看看DateTimeFormatter类的部分源码,如 图2所示。

图 2

由上可知,与SimpleDateFormat不同的是,DateTimeFormatter不但是不变对象,它还是线程安全的。线程的概念我们会在后面涉及到。

现在我们只需要记住:因为SimpleDateFormat不是线程安全的,使用的时候,只能在方法内部创建新的局部变量。而DateTimeFormatter可以只创建一个实例,到处引用。

接下来,我们来说一说DateTimeFormatter类的常用方法

//创建一个格式化程序使用指定的模式
static DateTimeFormatter ofPattern(String pattern) 
  
//创建一个格式化程序使用指定的模式和现场。
static DateTimeFormatter ofPattern(String pattern, Locale locale) 
 
//使用此格式化程序格式的日期时间对象
String format(TemporalAccessor temporal) 

其中,TemporalAccessor是一个接口,其实现类有LocalDate、LocalTime、LocalDateTime、ZonedDateTime等……

所以我们在使用format方法时,一般传入其实现类的实例化对象即可。

接下来我们举几个例子。

范例1:创建DateTimeFormatter

package edu.blog.test07;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeFormatterTestDemo01 {
    public static void main(String[] args) {
        //自定义输出格式
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        System.out.println(dtf.format(LocalDateTime.now()));
        System.out.println("===================================");
        //自定义格式解析
        LocalDateTime localDateTime = LocalDateTime.parse("2001/07/27 22:22:22", dtf);
        System.out.println(localDateTime);
    }
}

/*
结果:
2021/04/02 23:14:46
===================================
2001-07-27T22:22:22
*/

由上可知,DateTimeFormatter类格式化字符串的使用方式与SImpleDateFormat一样。

此外,另一种创建DateTimeFormatter的方法是,传入格式化字符串的同时,同时指定Locale。

范例2:按照Locale默认习惯格式化

package edu.blog.test07;

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class DateTimeFormatterTestDemo02 {
    public static void main(String[] args) {
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        System.out.println(zonedDateTime);
        System.out.println("==============================");

        DateTimeFormatter formatter01 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ZZZZ");
        System.out.println(formatter01.format(zonedDateTime));
        System.out.println("==============================");

        DateTimeFormatter formatter02 = DateTimeFormatter.ofPattern("yyyy MMM dd EE:HH:mm", Locale.CHINA);
        System.out.println(formatter02.format(zonedDateTime));
        System.out.println("==============================");

        DateTimeFormatter formatter03 = DateTimeFormatter.ofPattern("E, MMMM/dd/yyyy HH:mm", Locale.US);
        System.out.println(formatter03.format(zonedDateTime));
    }
}

/*
结果:
2021-04-02T23:27:59.326+08:00[Asia/Shanghai]
==============================
2021-04-02T23:27:GMT+08:00
==============================
2021 四月 02 星期五:23:27
==============================
Fri, April/02/2021 23:27
*/

运行本程序,分别以默认方式、中国地区和美国地区对当前时间进行显示,结果如上所述。

在格式化字符串中,如果需要输出固定字符,可以用’xxx’表示。

当我们直接调用"System.out.println()"对一个ZonedDateTime或者LocalDateTime实例进行打印的时候,实际上,调用的是它们的toString()方法,默认的toString()方法显示的字符串就是按照ISO 8601格式显示的,我们可以通过DateTimeFormatter预定义的几个静态变量来引用。

范例3:过DateTimeFormatter预定义静态变量

package edu.blog.test07;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeFormatterTestDemo03 {
    public static void main(String[] args) {
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);
        System.out.println(DateTimeFormatter.ISO_DATE.format(localDateTime));
        System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(localDateTime));
    }
}

/*
结果:
2021-04-02T23:38:11.707
2021-04-02
2021-04-02T23:38:11.707
*/

总结:对ZonedDateTime或LocalDateTime进行格式化,需要使用DateTimeFormatter类,DateTimeFormatter可以通过格式化字符串和Locale对日期和时间进行定制输出。


注:此文章为个人学习笔记,若有错误,敬请指正。

SimpleDateFormat与DateTimeFormatter的线程安全性 SimpleDateFormat 代码分析 /** * The {@link Calendar} instance used for calculating the date-time fields * and the instant of time. This field is used for both formatting and * parsing. * * <p>Subclasses should initialize this 阅读详情

相关推荐

联想Y9000P安装Ubuntu20.04记录

联想Y9000P 2022安装Ubuntu20.04问题记录

Legendyyy的博客 7115

SimpleDateFormat和DateTimeFormatter的区别及使用详解

SimpleDateFormat和DateTimeFormatter的区别及使用详解

2026也要一起加油鸭 3381

ZYNQ双核通信实战:手把手教你用OpenAMP搭建Linux+FreeRTOS开发环境(2018.3版)

本文详细介绍了如何在ZYNQ平台上使用OpenAMP框架实现双核通信,构建Linux与FreeRTOS协同开发环境。从开发环境配置、系统组件编译到OpenAMP框架应用,手把手指导开发者完成ZYNQ双核通信系统的搭建与调试,为异构计算开发提供实用解决方案。

weixin_33737134的博客 475

SimpleDateFormat和DateTimeFormatter

SimpleDateFormat和DateTimeFormatter

listeningdu的博客 1704

一文读懂 AI 模型训练流程

AI模型训练流程可分为五个关键步骤:首先进行数据准备,包括收集、清洗、标注和增强数据;其次选择合适的模型架构并搭建神经网络;然后通过前向传播、损失计算和反向传播进行模型训练;接着用验证集评估模型性能,并调整超参数;最后在测试集上检验模型泛化能力。整个过程需要精心设计每个环节,才能获得性能优异的AI模型。

牧晨加油站 1478

Proteus仿真AT89C51驱动DHT11:温湿度数据采集与LCD1602显示的5个调试坑点总结

本文总结了在Proteus仿真环境下使用AT89C51驱动DHT11温湿度传感器并通过LCD1602显示的5个常见调试坑点,包括DHT11时序问题、LCD1602初始化错误、数据校验失败、仿真特有差异及系统稳定性问题,提供了详细的解决方案和优化代码示例,帮助开发者高效完成温湿度采集项目。

weixin_30335575的博客 355

JAVA8为啥要用DateTimeFormatter代替SimpleDateFormat?

DateTimeFormatter,SimpleDateForma,java日期格式化

chen2017sheng的博客 2083

开关电源设计实战:如何用AP值快速选型磁芯(附计算公式推导)

本文为开关电源工程师提供了基于AP值的磁芯快速选型实战指南。文章深入解析了AP值作为磁芯‘功率吞吐量’指标的核心物理意义,并通过详细的公式推导和24W反激电源设计实例,手把手演示如何利用AP值计算公式,结合电流密度、窗口利用率等关键参数,从众多磁芯型号中高效筛选出合适型号,同时强调了选型后的关键校验步骤与常见误区。

weixin_29234239的博客 871

请别再使用 SimpleDateFormat 格式化时间了,DateTimeFormatter 更出色!

点击关注公众号,实用技术文章及时了解DateTimeFormatter类我们先来看看SImpleDateFormat类的部分源码,如图1所示。图1接着再来看看DateTimeFormatter类的部分源码,如 图2所示。图2由上可知,与SimpleDateFormat不同的是,DateTimeFormatter不但是不变对象,它还是线程安全的。线程的概念我们会在后面涉及到...

Java知音 540

RK3399外设驱动之MIPI

RK3399外设驱动之MIPI 文章目录RK3399外设驱动之MIPIMIPI命令解析入口代码mipi显示配置实例rk3399mipi驱动rk mipi驱动注册过程rk32_mipi_dsi.c解析 内核版本 Linux4.4 平台 rk3399 作者 nineyole MIPI命令解析入口代码 MIPI的入口代码如下:kernel\drivers\video\rockchip\screen\lcd_mipi.c static int __init rk_mipi_screen_in

学无止境 2227

42、Windows Server Update Services(WSUS)全面指南

本文全面介绍了Windows Server Update Services(WSUS)的安装、配置、管理与优化策略。内容涵盖WSUS基础认知、客户端更新问题解决、多服务器架构设计、计算机分组策略、更新审批与报告查看,并深入探讨了SSL加密配置、性能优化、与其他系统(如AD和SCCM)集成以及常见故障排查方法。通过本指南,IT管理员可高效部署和管理企业级软件更新,提升安全性和运维效率。

cicd6pipeline的博客 97

JAVA中日期转换SimpleDateFormat和DateTimeFormatter

一. SimpleDateFormat 想必大家对 SimpleDateFormat 并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类,他是以区域敏感的方式格式化和解析日期的具体类。 它允许格式化 (date -> text)、语法分析 (text -> date)和标准化。 1. 日期时间格式(例如:yyyy-MM-dd HH:mm:ss) 2. 实例说...

qinqinde123的博客 2万+

OpenClaw Windows 安装指南

好的,我来一步一步带你在 Windows 上安装 OpenClaw。

m0_60605453的博客 548

SimpleDateFormat 和 DateTimeFormatter 的异同

DateTimeFormatter 是更现代、更安全、功能更强大的选择,而 SimpleDateFormat 主要是为了向后兼容而保留。如果使用 Java 8 或更高版本,强烈建议使用新的 java.time API 和 DateTimeFormatter。

weixin_43885959的博客 1050

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

DateTimeFormatter的用法

DateTimeFormatter 提示:该文章的部分内容摘自廖雪峰微博,代码部分为自己测试内容 文章目录DateTimeFormatter前言一、使用java类库二、使用步骤1.LocalDate转换2.LocalDateTime 的转换 前言 使用旧的Date对象时,我们用**SimpleDateFormat**进行格式化显示。使用新的LocalDateTime或ZonedLocalDateTime时,我们要进行格式化显示,就要使用DateTimeFormatter。 和SimpleDateF

小七会喷火 6万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

将SimpleDateFormat改为DateTimeFormatter的使用区别

在jdk8可以使用DateTimeFormatter代替SimpleDateFormat,主要是DateTimeFormatter是线程安全的,SimpleDateFormat是线程不安全的。 SimpleDateFormat的使用: 由字符串转为日期的方法: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d...

sarida的博客 2962

DateTimeFormatter 与SimpleDateFormat 的区别

SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。这是阿里java开发规范提到 的强制要求。为何如此呢? SimpleDateFormat 是非线程安全类,在使用过程中可能会造成安全问题。多线程调用parse方法剖出的异常: DateTimeFormatter 显示说...

攻防人生3722的博客 5675

SimpleDateFormat与DateTimeFormatter

最近在项目中,涉及到日期转换以及多线程的一些问题。如果不涉及到多线程,则两者都可放心大胆的用。但是涉及到多线程的问题,就得注意下了,SimpleDateFormat是线程不安全。 1.何谓线程不安全? 多线程的执行并不是一个线程一个线程的顺序执行,而是相互抢夺cpu资源,拿到资源的就会执行。正式这个特点,如果这两个线程有一个公共的变量,一个线程读取变量并对变量做修改,那么另外一个线程两次访问的变量就会不同。 2.为什么simpleDateFormat是线程不安全? 我们先得看simpleDateFormat

xiaoliuxiix的博客 809

Java 8的DateTimeFormatter 和 SimpleDateFormat

DateTimeFormatter 和 SimpleDateFormat DateTimeFormatter 线程安全 ,SimpleDateFormat 非线程安全 DateTimeFormatter是Java8提供的新方式 单线程环境下DateTimeFormatter和LocalDateTime的parse性能比SimpleDateFormat的parse性能高 多线程环境下DateTim...

给变量取个名字 2553

SimpleDateFormat vs DateTimeFormatter:性能对比实测

SimpleDateFormat是Java早期提供的日期格式化类,但它存在线程安全问题,需要额外的处理才能在多线程环境下使用。而DateTimeFormatter由于是线程安全的,在多线程环境下表现稳定,性能几乎没有下降。DateTimeFormatter的内存占用比SimpleDateFormat更低,尤其是在高并发场景下,内存使用更加稳定,不会出现频繁的内存波动。通过生成的图表可以清晰看到,DateTimeFormatter在所有测试场景中均表现优异,尤其是在高并发环境下优势更加明显。

AmberLeopard26的博客 994

DateTimeFormatter和SimpleDateFormat

DateTimeFormatter是线程安全的 SimpleDateFormat线程不安全 SimpleDateFormat推荐每个线程实例化该对象,如果多个线程访问1个SimpleDateFormat,必须在外部使用同步 threadlocal方式 static ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>()..

kongkong的专栏 865

时间处理的坑:SimpleDateFormat与DateTimeFormatter

时间处理的坑:SimpleDateFormat与DateTimeFormatter

未知的希望,是我不灭的信仰 6201
上一篇: ZonedDateTime类
下一篇: 异常的捕获与处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值