jdk1.8中LocalDate、LocalTime、LocalDateTime的使用

用友U8其中一个账套提示演示期已到期-修复方法 【事件始末】 一朋友求助,反馈使用的用友U8,很多年了! 突然发现其中账套2021年的一个账套打不开,提示演示期限已到期! 但是其他账套完全正常,可以打开,没有任何问题。 不管是还原老旧备份,还是重装软件问题依旧,无法自己解决。 客户查询报表结算账期,情况比较紧急,于是求助我们。 经过多次反复琢磨和烟酒,终于于晚上23点59分给弄了出来,也总是圆满解决问题了。 【问题分析】 该用户打的是 U82X免狗补丁,估计是该补丁文件设置了 最大有效期,补丁到期了导致的。 也有可能是程序... 阅读详情

为什么建议使用你 LocalDateTime ,而不是 Date?

理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗

为什么需要LocalDate、LocalTime、LocalDateTime
【java8新提供的类】
java8新的时间API的使用方式,包括创建、格式化、解析、计算、修改

为什么需要LocalDate、LocalTime、LocalDateTime

Date如果不格式化,打印出的日期可读性差
Tue Sep 10 09:34:04 CST 2019
使用SimpleDateFormat对时间进行格式化,但SimpleDateFormat是线程不安全的SimpleDateFormat的format方法最终调用代码:

private StringBuffer format(Date date, StringBuffer toAppendTo,  
                              FieldDelegate delegate) {  
        // Convert input date to time field list  
        calendar.setTime(date);  

        boolean useDateFormatSymbols = useDateFormatSymbols();  

        for (int i = 0; i < compiledPattern.length; ) {  
            int tag = compiledPattern[i] >>> 8;  
            int count = compiledPattern[i++] & 0xff;  
            if (count == 255) {  
                count = compiledPattern[i++] << 16;  
                count |= compiledPattern[i++];  
            }  

            switch (tag) {  
            case TAG_QUOTE_ASCII_CHAR:  
                toAppendTo.append((char)count);  
                break;  

            case TAG_QUOTE_CHARS:  
                toAppendTo.append(compiledPattern, i, count);  
                i += count;  
                break;  

            default:  
                subFormat(tag, count, delegate, toAppendTo, useDateFormatSymbols);  
                break;  
            }  
        }  
        return toAppendTo;  
    }  

calendar是共享变量,并且这个共享变量没有做线程安全控制。
当多个线程同时使用相同的SimpleDateFormat对象【如用static修饰的SimpleDateFormat】调用format方法时,
多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值另外的
一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。

在多并发情况下使用SimpleDateFormat需格外注意SimpleDateFormat除了format是线程不安全以外,
parse方法也是线程不安全的。parse方法实际调用alb.establish(calendar).getTime()方法来解析,
alb.establish(calendar)方法里主要完成了

  • 重置日期对象cal的属性值
  • 使用calb中中属性设置cal
  • 返回设置好的cal对象

但是这三步不是原子操作

多线程并发如何保证线程安全 - 避免线程之间共享一个SimpleDateFormat对象,
每个线程使用时都创建一次SimpleDateFormat对象 => 创建和销毁对象的开销大 - 对使用format和parse方法的地方进行加锁 =>
线程阻塞性能差 - 使用ThreadLocal保证每个线程最多只创建一次SimpleDateFormat对象 => 较好的方法

Date对时间处理比较麻烦,比如想获取某年、某月、某星期,以及n天以后的时间,如果用Date来处理的话真是太难了,
你可能会说Date类不是有getYear、getMonth这些方法吗,获取年月日很Easy,但都被弃用了啊
使用java8全新的日期和时间API

LocalDate
只会获取年月日
创建LocalDate
//获取当前年月日  
LocalDate localDate = LocalDate.now();  
//构造指定的年月日  
LocalDate localDate1 = LocalDate.of(2019, 9, 10);  
获取年、月、日、星期几
int year = localDate.getYear();  
int year1 = localDate.get(ChronoField.YEAR);  
Month month = localDate.getMonth();  
int month1 = localDate.get(ChronoField.MONTH_OF_YEAR);  
int day = localDate.getDayOfMonth();  
int day1 = localDate.get(ChronoField.DAY_OF_MONTH);  
DayOfWeek dayOfWeek = localDate.getDayOfWeek();  
int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);  
LocalTime
只会获取几点几分几秒
创建LocalTime
 LocalTime localTime = LocalTime.of(13, 51, 10);  
 LocalTime localTime1 = LocalTime.now();  
获取时分秒
//获取小时  
int hour = localTime.getHour();  
int hour1 = localTime.get(ChronoField.HOUR_OF_DAY);  
//获取分  
int minute = localTime.getMinute();  
int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR);  
//获取秒  
int second = localTime.getSecond();  
int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE);  

LocalDateTime

获取年月日时分秒,等于LocalDate+LocalTime
创建LocalDateTime
LocalDateTime localDateTime = LocalDateTime.now();  
LocalDateTime localDateTime1 = LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56);  
LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);  
LocalDateTime localDateTime3 = localDate.atTime(localTime);  
LocalDateTime localDateTime4 = localTime.atDate(localDate);  
获取LocalDate
LocalDate localDate2 = localDateTime.toLocalDate();  
获取LocalTime
LocalTime localTime2 = localDateTime.toLocalTime();  

Instant

获取秒数
创建Instant对象
Instant instant = Instant.now();  
获取秒数
long currentSecond = instant.getEpochSecond();  
获取毫秒数
long currentMilli = instant.toEpochMilli();  
个人觉得如果只是为了获取秒数或者毫秒数,使用System.currentTimeMillis()来得更为方便
修改LocalDate、LocalTime、LocalDateTime、Instant

LocalDate、LocalTime、LocalDateTime、Instant为不可变对象,修改这些对象对象会返回一个副本
增加、减少年数、月数、天数等 以 LocalDateTime 为例

LocalDateTime localDateTime = LocalDateTime.of(2019, Month.SEPTEMBER, 10,  
              14, 46, 56);  
//增加一年  
localDateTime = localDateTime.plusYears(1);  
localDateTime = localDateTime.plus(1, ChronoUnit.YEARS);  
//减少一个月  
localDateTime = localDateTime.minusMonths(1);  
localDateTime = localDateTime.minus(1, ChronoUnit.MONTHS);  
  • 通过with修改某些值
//修改年为2019  
localDateTime = localDateTime.withYear(2020);  
//修改为2022  
localDateTime = localDateTime.with(ChronoField.YEAR, 2022);  

还可以修改月、日

时间计算

比如有些时候想知道这个月的最后一天是几号、下个周末是几号,通过提供的时间和日期API可以很快得到答案

LocalDate localDate = LocalDate.now();  
LocalDate localDate1 = localDate.with(firstDayOfYear());  

比如通过firstDayOfYear()返回了当前日期的第一天日期,还有很多方法这里不在举例说明

格式化时间

LocalDate localDate = LocalDate.of(2019, 9, 10);  
String s1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);  
String s2 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);  
//自定义格式化  
DateTimeFormatter dateTimeFormatter =   DateTimeFormatter.ofPattern("dd/MM/yyyy");  
String s3 = localDate.format(dateTimeFormatter);  
DateTimeFormatter默认提供了多种格式化方式,如果默认提供的不能满足要求,可以通过DateTimeFormatter的ofPattern方法创建自定义格式化方式

解析时间

LocalDate localDate1 = LocalDate.parse("20190910", DateTimeFormatter.BASIC_ISO_DATE);  
LocalDate localDate2 = LocalDate.parse("2019-09-10", DateTimeFormatter.ISO_LOCAL_DATE); 

和SimpleDateFormat相比,DateTimeFormatter是线程安全的

总结:

LocalDateTime:Date有的我都有,Date没有的我也有,日期选择请Pick Me

SpringBoot中应用LocalDateTime

将LocalDateTime字段以时间戳的方式返回给前端 添加日期转化类

public class LocalDateTimeConverter extends JsonSerializer<LocalDateTime> {  

    @Override  
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {  
    gen.writeNumber(value.toInstant(ZoneOffset.of("+8")).toEpochMilli());  
    }  
}  

并在

LocalDateTime  
字段上添加

@JsonSerialize(using = LocalDateTimeConverter.class)  
注解,如下:

@JsonSerialize(using = LocalDateTimeConverter.class)  
protected LocalDateTime gmtModified;  
//将LocalDateTime字段以指定格式化日期的方式返回给前端 在
LocalDateTime  
字段上添加

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")  
注解即可,如下:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")  
protected LocalDateTime gmtModified;  
对前端传入的日期进行格式化 在
LocalDateTime  
字段上添加

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")  
注解即可,如下:

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")  
protected LocalDateTime gmtModified;  
OWASP 2025版AI大模型攻击安全风险汇总(攻击方法种类) 提示词注入是大模型最基础、最常见的核心漏洞,攻击者通过构造直接或间接的恶意自然语言输入,篡改大模型原本的正常行为与输出结果。哪怕这类恶意内容对人类是隐藏、不可见的,只要模型能够正常解析读取,就会触发漏洞。它和大家常说的模型“越狱”相关,但并不等同:越狱是提示词注入的极端形式,会直接让模型彻底无视所有内置安全协议,完全脱离管控;而普通提示词注入,更多是针对性篡改模型行为、诱导执行特定操作。 阅读详情

相关推荐

Carla-UE4Editor导入RoadRunner地图文件(保姆级教程)

以Carla官网导入RoadRunner地图的标准文档为参考,里面增添了很多细节和注意事项,遇到问题的小伙伴过来看看吧。

DSK_981029的博客 1万+

Java8 LocalDate、LocalTime、LocalDateTime详细使用场景+案例+常用工具类

代码: package com.saint.base.localdate; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.Date; /** * @author Saint */ public class CurrentDate { public static void main(String[] arg

健身变秃,coding变强 1929

OpenEuler内核编译及替换

一、内核源码下载 在gitee上下载OpenEuler内核源码 下载地址 选择需要的内核版本源码压缩包进行下载 二、内核编译 1.解压缩 将下载好的源码进行解压 tar xvf openeuler-kernel-4.19.90-2107.1.0.tar.gz 2.清理源代码树 解压后得到一个名为kernel的内核源码文件夹,进入后执行命令 make mrproper 清理过去内核编译产生的config,第一次编译时可不执行此命令 3.生成内核配置文件.config 先将将系统原配置文件拷贝过来,原

m0_56602092的博客 2万+

JDK1.8更便捷获取时间的方法:LocalDateTime、LocalDate、LocalTime、Period以及跟Date类型的转换

JDK1.8更便捷获取时间的方法:LocalDateTime、LocalDate、LocalTime、Period,以及跟Date类型的转换

qq3892997的博客 1554

JLINK/SWD/STLINK下载选项区别

摘要: 本文对比了JLINK/SWD/STLINK的6种下载模式:Normal(硬件复位)、Hot plug(无复位)、Under reset(持续复位后连接)、Software reset(软件复位)、Hardware reset(全复位)和Core reset(内核复位)。重点分析了各模式的操作逻辑、适用场景及注意事项,其中Under reset模式是解决SWD禁用/程序异常的首选方案。通过对比表归纳了复位范围、NRST操作等核心差异,并给出场景选择建议:排查连接问题优先选Under reset,常规调

亚洲程序员盟主得博客 394

A2B音频总线在智能座舱中的应用

车载A2B链路音频是智能座舱的核心功能,涵盖车载音响、语音识别、e-Call、消噪及回声消除等应用,随着汽车智能网联化的发展,对音频的开发要求也越来越高,需要加入更先进、功能丰富的信息娱乐功能以满足消费者的用户体验。但传统的模拟并行音频信号传输方式,难以在功能增加与整车轻量化(线缆的重量及成本减少)之间取得均衡。这时候就需要A2B音频总线了。A2B音频总线用于连接车辆中的音频设备,如麦克风(MIC)、功放(AMP)、多媒体主机(Head Unit)和T-BOX等。通过一条低成本的非屏蔽双绞线UTP,进行跨距

怿星科技的博客 3933

jdk1.8 LocalTime、LocalDate、LocalDateTime 使用大全

LocalTime、LocalDate、LocalDateTime是java8对日期、时间提供的新接口。

weixin_41200988的博客 1488

openEuler 快速入门

openEuler 是一个专注于企业领域的 Linux 发行版,广泛应用于服务器、云计算和边缘计算场景。最初由华为开发,现在由 Open Atom Foundation 进行开发和管理。Open Atom Foundation 是中国第一个开源软件基金会,得到了华为、阿里巴巴、腾讯、百度等知名企业的支持,并且中国信息通信部也是该基金会的一部分。可以将 openEuler 看作是 Red Hat 或 SUSE Linux 的等价物,但它与 SUSE Linux 更为相似。

HuaweiLab_Peach的博客 2052

java JDK1.8 LocalDate\LocalTime\LocalDateTime 获取当前时间、设定时间、在原有时间基础上加减时间

1111

weixin_35695688的博客 1275

UDS诊断服务基础详解之二19服务

本文主要介绍UDS统一诊断服务的19 01服务,包含状态位和故障码的解析以及19 01服务的具体说明

车载网络小D的博客 1万+

基于EB工具的TC3xx_MCAL配置开发05_ADC模块硬件Pwm触发Demo配置

基于EB工具,硬件Pwm触发ADC采集Demo配置详细介绍

initiallizer的博客 3505

【Java】Jdk8 LocalDate、LocalTime和LocalDateTime

LocalDate、LocalTime和LocalDateTime是Java 8中引入的日期和时间类,它们都属于java.time包。LocalDate:表示日期,不包含时间和时区信息。它可以用于存储和操作年、月、日的值。例如,可以使用LocalDate来表示生日、会议日期等。LocalTime:表示时间,不包含日期和时区信息。它可以用于存储和操作时、分、秒的值。例如,可以使用LocalTime来表示每天的固定时间点,如午夜、中午等。LocalDateTime:表示日期和时间,不包含时区信息。

zxcyxg123的博客 1191

【x265编码器】章节1——x265的lookahead模块分析

目录一、模块功能二、lookahead模块分析1.调用流程2.代码分析Lookahead::addPicture()Lookahead::checkLookaheadQueue()Lookahead::getDecidedPicture()Lookahead::findJob()Lookahead::slicetypeDecide()PreLookaheadGroup::processTasksLookaheadTLD::lowresIntraEstimate()Lookahead::slicetypeAn

vcvdv123的博客 4万+

JDK8特性之LocalDateTime

JDK1.8除了新增了lambda表达式、stream流之外,它还新增了全新的日期时间API。 在JDK1.8之前,Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。因此推出了java.time包,该包下的所有类都是不可变类型而且线程安全。 LocalDate:本地日期,不包含具体时间, 格式 yyyy-MM-dd。 LocalTime:本地时间,不包含日期. 格式 yyyy-MM-dd H

ldcaws的专栏 509

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LocalDate、LocalTime、LocalDateTime

LocalDate、LocalTime、LocalDateTime以及DateTimeFormatter

xiaozhou的博客 366

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【JDK】LocalDateTime、LocalDate、LocalTime的简单理解和mybatis映射

       使用JDK1.8的LocalDateTime、LocalDate、LocalTime。        JDK1.8的这三个时间类,相对于以前的Date而言,可读性更好,操作也更方便,表面上看起来LocalDateTime=LocalDate + ...

tangxz的博客 801

OV9734 DATASHEET,完整规格书

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

JDK1.8时间工具类

JDK1.8时间工具类 一、特点:比起Date类和Calendar类,jdk1.8的时间类更全面、线程安全、可修改 二、JDK1.8各时间类特点及应用 2.1、LocalDate类 //取当前日期 LocalDate today=LocalDate.now(); System.out.println("today = " + today); 输出:today = 2020-11-24 //取当前日期 LocalDate today=LocalDate.now(); //获取.

xnian_的博客 1502

localdatetime 默认时间_LocalDate LocalTime LocalDateTime Instant的操作与使用

一.简介LocalDate表示当前(或指定)日期,格式为:yyyy-MM-ddLocalTime表示当前(或指定)时间,格式为:HH:mm:ss SSSLocalDateTime表示当前(或指定)日期时间,格式为:yyyy-MM-ddTHH:mm:ss SSS ,是前2者的结合Instant表示当前(或指定)时间瞬时点,或者瞬间点二.使用介绍jdk1.8之后对表示时间的类型进行了重新编写,表示当前...

weixin_39722917的博客 1441

JDK1.8 中的日期与时间 API

为什么 JDK 1.8 之前的时间与日期 API 不好用? 1、java.util.Date 是从 JDK 1.0 开始提供,易用性差 默认是中欧时区(Central Europe Time) 起始年份是 1900 年 起始月份从 0 开始 对象创建之后可修改 2、JDK 1.1废弃了 Date 中很多方法,新增了并建议使用java.util.Calendar 类 相比 Date 去掉了年份从 1900年开始 月份依然从 0 开始 选...

ConstXiong 812

java日期还在用Date吗,jdk1.8的LocalDateTime不妨了解一下

说到java中的Date,大部分人应该都用过,我见到的项目中也都是使用Date(加上Calendar)来处理各种时间日期的。所以并没有对这个类产生过什么想法,后来看到有人推荐使用LocalDateTime来处理,然后看了下Date相关的一些使用,发现还有隐藏着一些问题的。 说到Date就不能不再说一下DateFormat,因为Date输出的日期(Fri Oct 25 10:01:03 CST 2...

梦寻千古的博客 1511

JDK1.8新增的时间日期API

在JDK1.7中,处理日期相关的数据我们使用java.util.Data,算得上是一个万能的接口,他包含了日期、时间、还有毫秒数。当使用他存储日期或者只存储时间,那么只有定义的人才知道哪些数据是有用的。而且在java.util.Date中的月份从0开始,一月是0,十二月是11。 在JDK1.8及以后的API中,对于时间的使用我们更加便利。新增了LocalDate、LocalTime、LocalD

鱼刺刺 1万+

jdk1.8日期时间组件

jdk1.8日期时间组件参考文献:Java Date-Time Packagesjdk8引入了全新的日期和时间组件,并把它们归纳到一系列的包下。核心包java.time使用的历法采用ISO-8601标准,当然,我们也可以使用java.time.chrono包中的一些非标准的历法,比如日本帝国历法(天皇年号)、泰国佛教历法(佛陀诞生)、中华民国历法(辛亥革命)、伊斯兰黑蚩

jing的专栏 8005

Java8新的日期时间类,你会用吗?

在JDK1.8之前,日期和时间的处理一直是Java里面经常被吐槽的问题,相信使用过Date和Calendar的人都有深刻的感觉,不管你是要进行日期和时间的计算或者相互比较,在使用Date和Calendar时都表现的很麻烦,总之一句话就是不好用。 以至于在JDK1.8之前,很多人都选择使用joda-time来进行日期和时间的处理,joda-time对日期和时间的处理进行了封装,使日期和时间的处理变得简单 在JDK1.8中引入java.time.*包,重新定义了一套日期时间处理类, 让日期时间的处理变得简单易用

果子爸聊技术 1万+

JDK1.8 新增的日期时间API

JDK1.8 新增的日期时间API LocalDate、 LocalTime、LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。 注: ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法 这些新增的日期时

Decade12580的博客 3776

JDK1.8的日期时间工具类

JDK1.8中增加的日期时间工具类操作日期类LocalDate操作时间类LocalTime操作日期时间类 LocalDateTimeDuration类用来获取两个LocalTime或LocalDateTime相差的时间Period类用来获取两个LocalDate相差的日期获取指定时区的时间 操作日期类LocalDate 太方便了,提供了非常多的方法,比之前的DateFormat好用多了,直接上代码 //给定日期 LocalDate date=LocalDate.of(2018,12,2); System.o

weixin_38117760的博客 1147

JDK 1.8 新特性 Date Time包介绍

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

W1040585666的博客 1353
上一篇: JDK8 的 Lambda、Stream、LocalDate的使用总结
下一篇: spring boot整合security后,swagger打不开, 显示请确保资源接口正确
意田天
博客等级 码龄7年 41粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

意田天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值