JDK1.8之DateTimeFormatter

Modbus TCP 通信(C#) 【代码】Modbus TCP 通信(C#) 阅读详情

我们常用的日期格式方式就是使用SimpleDateFormat,SimpleDateFormat在我们系统的里面,经常会用到,比如转换时间戳导出、打印啊等等。
伪代码:
在这里插入图片描述
正常我们都会这样使用转换时间
注意:有些是需要的时候创建新实例
如:工具类,创建新的实例
SimpleDateFormat在并发下会出现出现时间不对,线程挂死等等。
见源码:
在这里插入图片描述
作者写的注释:
翻译为:

  • 日期格式不同步。
  • 建议为每个线程创建单独的格式实例。
  • 如果多个线程同时访问一种格式,则必须从外部对其进行同步。

我们常用的format方法,我们去看看。
在这里插入图片描述
其次底层操作用的是calendar,然后声明的时候如果用static修饰变量,那么calendar变量也是就是一个共享变量,如果simpledateformat被用在n多方法,就你比如导出,需要各种转换的时候,那并发的时候,就会出现线程1执行完calendar.setTime(date),设置了值,这时候挂起的时候,线程2拿到了执行权,线程2也执行了calendar.setTime(date),线程2挂起了,然后线程1取值的时候,被其它竞争线程修改了值,那就会出现时间不对,线程挂死等。
如果需要用到simpledateformat,那如何解决这个问题

这里先要提2个东西
JDK1.8之前,JDK1.8之后
先讲JDK1.8之前
按上述作者的注释

一:JDK1.8之前

1:加一个同步锁

publict Class SimpleDateFormatTest{

public static String formatDate(Date date) {
		synchronized (formater) {			
			return formater.format(date);
		}
	}
}

在这里插入图片描述
一个同步锁搞定,但是我们知道同步锁会影响效率,高并发下会影响性能的

2:ThreadLocal

本地线程 - 解决线程竞争,安全不影响效率
在这里插入图片描述

private static ThreadLocal<DateFormat> threadLocalFormater = new ThreadLocal<DateFormat>() {
    @Override
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }
};
public static String threadLoaclFormatDate(Date date) {
    return threadLocalFormater.get().format(date);
}

二:JDK1.8之后

java.time.format包下的DateTimeFormatter,是JDK1.8加入的日期格式化工具类,引入这个工具类就是解决了SimpleDateFormat的线程安全问题
见源码:
在这里插入图片描述
简述:
DateTimeFormatter不单单是不变对象,并也是线程安全的。
见源码:258行,作者的注释
在这里插入图片描述
SimpleDateFormat不是线程安全的,使用的时候,只能在方法内部创建新的局部变量。而DateTimeFormatter可以只创建一个实例,到处引用。

1 常用方法:

1.1 实例化方式:

预定义的标准格式;如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相关的格式;如:ofLocalizedDateTime(FormatStyle.LONG)
自定义的格式;如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

1.2 常用方法

		// 自定义格式如:ofPattern("yyyy-MM-dd hh:mm:ss")
        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");// 12小时
        DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 24小时

        /* 日期类型转换字符串 -- start */
        // LocalTime  --> String
        LocalTime localTime = LocalTime.now();
        String format1 = localTime.format(DateTimeFormatter.ISO_TIME); // 15:01:22.42

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss");
        String format2 = localTime.format(formatter);

        System.out.println("LocalTime  --> String:" + format1);
        System.out.println("LocalTime  --> String:" + format2);
        // LocalTime  --> String

        // localDate --> String
        LocalDate localDate1 = LocalDate.now();
        String format3 = localDate1.format(DateTimeFormatter.BASIC_ISO_DATE);    // yyyyMMdd
        String format4 = localDate1.format(DateTimeFormatter.ISO_DATE);          // yyyy-MM-dd
        System.out.println("LocalDate --> String:" + format3);
        System.out.println("LocalDate --> String:" + format4);

        // LocalDateTime  --> String
        LocalDateTime localDateTime = LocalDateTime.now();
        String timeStr1 = localDateTime.format(dateTimeFormatter1);
        System.out.println("LocalDateTime  --> String:" + timeStr1);

        String timeStr2 = dateTimeFormatter1.format(LocalDateTime.now());
        System.out.println("LocalDateTime  --> String:" + timeStr2);
        // LocalDateTime  --> String

        /* 日期类型转换字符串 -- end */

        /* 字符串转日期类型 -- start */

        // String --> LocalDate
        LocalDate localDate2 = LocalDate.parse("2021-05-11 11:32:05",dateTimeFormatter2);
        System.out.println("String --> LocalDate:" + localDate2);

        LocalDate localDate3 = LocalDate.parse("2021-05-11");
        System.out.println("String --> LocalDate:" + localDate3);

        DateTimeFormatter pattern1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        System.out.println("String --> LocalDate:" + LocalDate.parse("2021-05-11").format(pattern1));
        // String --> LocalDate

        // String --> LocalTime
        LocalTime localTime2 = LocalTime.parse("07:43:53");
        System.out.println("String --> LocalTime:" + localTime2);
        // String --> LocalTime


        // String -->LocalDateTime
        LocalDate localDate4 = LocalDate.parse("2021-05-11 15:30:53",dateTimeFormatter2);
        System.out.println("String -->LocalDateTime:" + localDate4);
        // String -->LocalDateTime

        /* 字符串转日期类型 -- end */

        // 解析
        // 注意:我的日期格式12小时制,但是我的文本时间是24小时制,启动看会报什么错
		// TemporalAccessor temporalAccessor1 = dateTimeFormatter1.parse("2021-05-11 15:32:05");
		// System.out.println(temporalAccessor1);
        // java.time.format.DateTimeParseException: Text '2021-05-11 15:32:05' could not be parsed:
        // Invalid value for ClockHourOfAmPm (valid values 1 - 12): 15
        TemporalAccessor temporalAccessor2 = dateTimeFormatter1.parse("2021-05-11 11:32:05");
        // {SecondOfMinute=5, MilliOfSecond=0, NanoOfSecond=0, HourOfAmPm=11, MinuteOfHour=32, MicroOfSecond=0},ISO resolved to 2021-05-11
        System.out.println(temporalAccessor2);

如果你的JDK是1.8,并且你的simpledateformat没有做线程安全处理,除了上述的解决方案,强烈建议你使用JDK1.8推出的DateTimeFormatter ,如果没有用,别人搞这个干吗,需要注意的是,要使用instant代替Date,LocalDateTime替代Calendar

这边给出一些常用的转换方法

// date与instant的相互转化 -- start
Instant now = Instant.now();
System.out.println("时间戳与北京时间相差8个时区:"+now);
// 我们去查看源码: 272行
// 发现是采用的UTC,如果你需要使用北京时间,则需要增加8个小时
Instant nowUTC = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));
System.out.println("nowUTC :"+nowUTC );

Date date = Date.from(now);
System.out.println(date);

Instant instant = date.toInstant();

// LocalDate、LocalDateTime 的now()方法使用的是系统默认时区 不存在Instant.now()的时间问题。
// date与instant的相互转化 -- end

// LocalDateTime代替Calendar -- start
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);
int year = localDateTime.getYear();// 年
int month = localDateTime.getMonthValue();// 月
int dayOfMonth = localDateTime.getDayOfMonth();// 日
int hour = localDateTime.getHour();// 小时
int minute = localDateTime.getMinute();// 分钟
int second = localDateTime.getSecond();// 秒
System.out.println(year);
System.out.println(month);
System.out.println(dayOfMonth);
System.out.println(hour);
System.out.println(minute);
System.out.println(second);
// LocalDateTime代替Calendar -- end


// DateTimeFormatter代替SimpleDateFormat
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 24小时制

// Date格式化成String -- start
String format = dateTimeFormatter.format(localDateTime);
System.out.println("Date格式化成String:" + format);
// Date格式化成String -- end

// String获得Date -- start
LocalDateTime parse = LocalDateTime.parse(format, dateTimeFormatter);
ZoneOffset offset = OffsetDateTime.now().getOffset();
Instant instant2 = parse.toInstant(offset);
Date date1 = Date.from(instant2);
System.out.println("String获得Date:" + date1);
// String获得Date -- end

在这里插入图片描述
见阿里巴巴手册:
在这里插入图片描述

MDK开发篇:基于立创逻辑派FPGA-G1与Cortex-M1软核的按键控制LED实战 本文详细介绍了基于立创逻辑派FPGA-G1开发板与高云Cortex-M1软核的完整开发流程。通过Gowin云源软件配置软核系统与GPIO外设,并在Keil MDK环境中编写按键控制LED的C程序,最终实现程序固化与上电自启动。教程涵盖硬件配置、软件开发、在线调试与固化部署全步骤,帮助STM32开发者快速上手FPGA软核开发。 阅读详情

相关推荐

机械臂电机力矩计算

设计 6 轴机械臂时,电机力矩计算是确保机械臂负载能力、运动精度和安全性的核心环节,需围绕和两大核心展开,结合机械臂结构参数(如关节长度、质量分布)、负载需求(如末端负载重量、惯性)和运动参数(如加速度、角速度)逐步推导。

ZPC8210的博客 1857

SimpleDateFormat和DateTimeFormatter的区别及使用详解

SimpleDateFormat和DateTimeFormatter的区别及使用详解

2026也要一起加油鸭 3381

从零开始:用Xilinx FPGA实现RISC-V单周期CPU(附完整Verilog代码)

本文详细介绍了如何使用Xilinx FPGA从零开始实现RISC-V单周期CPU,包括开发环境搭建、核心架构设计、Verilog代码实现及功能验证。通过实战指南和完整代码示例,帮助开发者掌握RISC-V CPU设计的关键技术,适用于嵌入式系统和定制化计算场景。

weixin_30664051的博客 547

DateTimeFormatter线程安全性测试

经测试,DateTimeFormatter确实是线程安全的,可以定义为 static 共享使用 import org.junit.Test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.

amiao1992的博客 2013

MSTAR数据集下载地址及处理方法

首先感谢博主冯子材提供下载的百度网盘地址。 在这里为了防止侵权,特此鸣谢,并给出其博客地址。 地址中有MSTAR百度网盘下载地址和需要使用的数据介绍,其中百度网盘中有数据转换工具 https://blog.csdn.net/taifengzikai/article/details/80600355 工具使用 因为下载得到的数据是二进制文件,需要使用官方提供的工具进行转换,可将其转换为jpeg。 有...

KamenRider 1万+

STM32F4系列HAL库配置定时器实验——输入捕获

STM32F4系列HAL库配置定时器实验——输入捕获 输入捕获简单讲解 输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量周期和频率为例,用一个简图来说明输入捕获的原理 假定定时器工作在向上计数模式, 图中 t1~t2 时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x 为 上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道 x为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这样,根据定时器

azs0504的博客 9286

JDK 1.8 新特性 Date Time包介绍

不要再用SimpleDateFormat 来处理日期数据了,JDK 1.8 新特性 Date Time

W1040585666的博客 1353

避开SM30维护视图的坑:自动更新字段+日志记录的5个关键配置步骤

本文深入解析了SAP ABAP开发中SM30维护视图的深度定制,聚焦于实现自动更新字段与日志记录功能。文章详细阐述了从SE54配置起点到核心编码的5个关键步骤,重点讲解了如何利用事件驱动模型(如05创建事件和01保存前事件)安全操作动态数据结构,并提供了避免常见陷阱的实用技巧,帮助开发者构建稳定可靠的自动化维护机制。

plant的博客 622

JAVA8为啥要用DateTimeFormatter代替SimpleDateFormat?

DateTimeFormatter,SimpleDateForma,java日期格式化

chen2017sheng的博客 2083

从芯片选型到光学集成:手持激光测距仪硬件设计全解析

本文全面解析手持激光测距仪的硬件设计,从芯片选型到光学集成,详细介绍了相位法测距技术的核心原理与方案选择。通过模块化设计、信号链路优化及PCB布局技巧,实现毫米级精度。文章还分享了量产化关键控制点,帮助工程师规避常见设计陷阱,提升产品可靠性。

weixin_30425949的博客 445

CloudCompare 和 PCL:点云网格化分析与处理

点云网格化是将点云数据转化为规则网格的过程,其主要思想是将离散的点云投影到一个平面上,然后对该平面进行划分,形成一系列小区域。在点云网格化方面,PCL 提供了各种算法和工具,可以实现高效的点云网格化操作。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化算法参数,如搜索半径和最大三角形边长等,执行了网格化操作,最后将网格化结果保存到输出文件中。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化参数,如分辨率等,执行了网格化操作,最后将网格化结果保存到输出文件中。

TechPulseZ的博客 1291

Java8中DateTimeFormatter真的是线程安全的吗?

给我搞了一下午到晚上9点多,把这个问题记录复盘,也是奇葩问题遇到的多,解决的也是那么酸爽的,废话不多说,接下来看如何解决吧。

qq_34905631的博客 2401

如何正确的计算两个角度的角度差?

这一步是必要的,因为它确保了无论a相对于b是在逆时针方向还是顺时针方向,d2总是正确地反映出绕圆相反方向的角度差。这样,当函数进行最后的比较时,它能够准确地比较两个方向的旋转路径并选择最短的一个。

小秋 AI SLAM 入门实战教程 4136

JDK1.8新特性LocalDate和DateTimeFormatter时间转化

前言: NewDate和SimpleDateFormat线程不安全,之前一直用的是第三方的joda-time,date4j解决线程安全问题,现在jdk1.8新特性中LocalDate解决了线程安全的问题。 测试数据如下: 输入: // 获取当前的日期         LocalDateTime currentTime = LocalDateTime.now();         Loca...

qwzeng123的博客 4862

NTscan扫描工具

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【jdk1.8特性】之LocalDateTime与DateTimeFormatter

声明一:学习完本文知识以及上一篇博客Instant的知识后,我们就可以使用Instant、LocalDateTime、 DateTimeFormatter来取代Date、Calendar,SimpleDateFormatle了。 提示:Calendar和SimpleDateFormatle都是线程不安全的,(无论程序是不是多线程, ...

JustryDeng 1205

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk1.8的LocalDateTime和DateTimeFormatter的简单使用

LocalDateTime LocalDateTime是线程安全的,而Date是线程不安全的。 LocalDateTime time=LocalDateTime.now();//初始化 time.getMinute();//得到分钟 time.getMonthValue();//得到月份 time.getYear();//得到年份 time.getHour();//得到小时 time.getSec...

weixin_41358538的博客 427

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java,SimpleDateFormat(jdk1.7)线程不安全和DateTimeFormatter(jdk1.8)线程安全区别与使用

区别: SimpleDateFormat是线程不安全的,在并发环境下使用SimpleDateFormat(方法见使用); DateTimeFormatter是线程安全的,jdk8自带( java.time.format.DateTimeFormatter); Joda time里的DateTimeFormat也是线程安全。 多线程中使用: SimpleDateFormat: 在需要执行时间格式化...

DxhToStage的博客 1849

JAVA - 【JDK1.8线程安全时间类】Instant、LocalDateTime、DateTimeFormatter

目录 将字符串转换为Date 获取Date日期的毫秒值 获取当前日期的毫秒值 求解 <一> 将字符串转换为Date String s = "2017-12-22"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse(s); <二> 获取Date日期的毫秒值...

⚡ 1031

java8 DateTimeFormatter LocalDateTime

jdk1.8中新增了 LocalDate 与 LocalDateTime等类来解决日期处理方法,同时引入了一个新的类DateTimeFormatter来解决日期格式化问题。 LocalDateTime,DateTimeFormatter两个类都没有线程问题,只要你自己不把它们创建为共享变量就没有线程问题。 格式化: DateTimeFormatter formatter = DateTime...

Fay.Q 698

时间、日期处理类(Jdk8之后)

Jdk1.7的问题   在Jdk1.8版本发布了新的Date-Time API来加强对时间、日期的处理。这是因为在Jdk1.7中时间、日期的处理上存在如下的一些问题。 非线程安全。Date类是非线程安全的,这是Java时间日期类中最大的问题。 设计很差。①在java.util包和java.sql包下都有时间日期类Date,java.util.Date同时包含时间和日期,而java.sql.Date只包含日期,这两个类具有相同名字,这是一种非常糟糕的设计;②Date类的格式化和解析类SimpleDateFo

柚咖小窝 553

Jdk 1.8新特性的一些积累

Jdk 1.8新特性的一些积累 1 时间类 jdk1.8 提供了一系列关于处理日期、时间的工具类来替换以前的Date()、SimpleDateFormat()。原因有一下几点: Date类的toString格式很不友好 Date类的许多方法都已过时 SimpleDateFormat类不是线程安全的,在多线程访问时,需要在外部加锁保证安全 下面给出新版时间日期LocalDateTime、Loca...

Anly_jia的博客 402

关于jdk1.8 中DateTimeFormatter线程安全的时间管理类的用法

定义(可以定义成静态的和非静态的两种)我们今天用的是静态的方式 private static DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM"); (1)创建LocalDateTime对象 LocalDateTime localDateTime = LocalDateTime.now(); ZoneId...

外星人的程序生涯 1838

java基础知识(jdk1.8的日期时间)

JDK1.8 新增特性(一)~ 1.1 获取对象的方法 * 方式1 通过静态方法 now(); 例如:LocalDateTime ldt = LocalDateTime.now(); * 方式2 通过静态方法of()方法参数可以指定年月日时分秒 例如:LocalDateTime of = LocalDateTime.of(2018, 12, 30, 20, 20, 20); 1....

Liyuehahaha的博客 1344

彻底弄懂Java中的日期时间类(JDK1.7之前、JDK1.8新增)

7.1 日期时间类(1.7之前) 7.1.1 Date类 Date表示当前时刻 常见的构造方法: 返回值 方法 含义 Date new Date() 获取当前时间的Date对象 Date new Date(long date) 使用指定的毫秒值来获取相对应的Date对象(从1970年1月1日00:00:00 GMT 开始算) public class DateTimeTest { public static void main(String[] args) {

cd546566850的博客 1296

jdk5和jdk8中获取当前日期的方法

public class LearnDate { public static void main(String[] args) { String format = new SimpleDateFormat("yyyy/MM/dd") .format(new Date()); System.out.println(format); } } Jdk1.5中的方法,存在线程不安全的问题 public class Le..

xiaobai_267的博客 212

JDK1.8 新增的日期时间API

JDK1.8 新增的日期时间API (一)JDK1.8 新增的日期时间AP 1.获取方法 public class MyTest { public static void main(String[] args) { //JDK1.8新增的时间日期API /* LocalDate 表示年月日 LocalTime 表示时分秒 ...

weixin_42584545的博客 121
上一篇: Java+CountDownLatch多任务处理优化
下一篇: Guava之RateLimiter限流
BugRoot
博客等级 码龄9年 9粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值