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

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

  • juejin.im/post/5d7787625188252388753eae

在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用 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) {
        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,但都被弃用了啊

Come On 一起使用 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.getMinute();
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 修改某些值

localDateTime = localDateTime.withYear(2020);
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实现过滤器、拦截器与切片
Java实现文件批量导入导出实践(兼容xls,xlsx)
好文!必须点赞
LocalDateTime和Date这两个时间类更加推荐使用哪个? 但是,如果你正在开始一个新的项目或进行现有项目的重构,强烈建议使用 java.time 包中的 LocalDateTime 和其他相关类。在大多数情况下,推荐使用LocalDateTime,因为它提供了更灵活和全面的日期时间处理功能,而且更适用于现代的应用开发。更好的日期时间分离: Date 组合了日期和时间信息,而 LocalDateTime 允许更好地分离这些信息,使得处理仅涉及日期或时间的情况更加简单。更直观的操作: LocalDateTime 的方法和操作更直观,更易于理解和使用。 阅读详情

相关推荐

仿人型机械臂逆运动学避坑指南:当末端三关节平行时如何处理奇异点

本文深入探讨了6R仿人型机械臂在末三轴平行结构下的逆运动学求解策略,重点分析了运动学逆解中的奇异点问题及其处理方法。通过MATLAB实现展示了D-H参数建模、几何解析法求解流程以及奇异点规避策略,为工业机器人开发提供了实用的数值算法方案和工程优化技巧。

sss66的博客 884

LocalDateTime(LocalDate、LocalTime)用法总结

1. 为什么使用LocalDateTime? (1)Date类及时间格式化SimpleDateFormat类线程不安全,LocalDateTime类及其时间格式化DateTimeFormatter类线程安全。 (2)Date类可读性差,LocalDateTime类可读性友好。 (3)Date的方法被弃用等原因。 2. 具体使用方式 引用的类主要是java.time.xxx包里的: import j...

技术探求 4390

动态对抗Zygisk-IL2CppDumper:Unity游戏安全新策略

本文深入探讨了对抗Zygisk-IL2CppDumper攻击的Unity游戏安全新策略。通过实时内存监控、动态混淆技术和异常行为检测体系,有效防止关键代码被动态提取。文章详细介绍了内存指纹系统、运行时混淆方案和五维特征模型等实用防御手段,帮助开发者提升游戏安全性。

weixin_29325955的博客 306

我们为什么要使用LocalDateTime

原文:https://www.cnblogs.com/huanshilang/p/12013386.html 参考资料: https://mp.weixin.qq.com/s/Dd_7yUh3lq3TqE2cjsYXvw 为什么要使用LocalDateTime1 引言1.1 Date如果不格式化,打印出的日期可读性差1.2 使用SimpleDateFormat对时间进行格式化,但SimpleDateFormat是线程不安全的。SimpleDateFormat的format方法最终调用代码:2. Java8全

进击的豌豆的博客 736

从Level 1到Level 22:手把手带你用Burp Suite通关burp-labs靶场全关卡(附难点解析)

本文详细解析了如何使用Burp Suite通关burp-labs靶场的22个关卡,从基础爆破到复杂编码绕过,涵盖Intruder配置、响应过滤、POST请求处理、MD5爆破等关键技术。特别针对Level 16的三重编码和Level 20的中文响应处理等难点提供实战技巧,帮助渗透测试工程师提升Web安全实战能力。

weixin_28831461的博客 436

道闸不自动落杆故障排查:从传感器原理到控制器调试全解析

在工业自动化和物联网系统中,传感器与控制器构成的闭环控制是保障设备可靠运行的核心。其基本原理是通过传感器采集环境状态,控制器依据预设逻辑做出决策并驱动执行器动作。这一技术价值在于实现了无人值守下的安全、高效自动化,广泛应用于智能交通、安防和智能楼宇等领域。以停车场道闸系统为例,其自动落杆功能高度依赖地感线圈与防砸雷达的协同。地感线圈作为触发单元,负责感知车辆接近;而防砸雷达则作为持续监测的安全单元,通过微波探测防砸区域内是否有障碍物,其信号是控制器执行落杆决策的关键依据。当系统出现车辆通过后闸杆不落的典型故

weixin_29190651的博客 313

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

在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗 通过阅读本篇文章你将了解到: 为什么需要LocalDate、LocalTime、LocalDateTime【java8新提供的类】 java8新的时间API的使用方式,包括创建、格式化、解析、计算、修改 为什么需要LocalDate、Loc...

Java笔记虾 6万+

一本集成电路静态时序设计经典之作(可下载)

本书全面深入探讨集成电路设计中关键技术的专著,涵盖了从基础知识到高级应用的各个方面。本书详细介绍了集成电路的发展历程、**静态时序分析的重要性、基本时序模型、时序信息库文件的构建、时序约束的设置、串扰噪声的影响及其控制方法**,并通过实战案例展示了如何进行有效的时序分析和优化。

nuoweishizi的博客 852

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

当多个线程同时使用相同的SimpleDateFormat对象【如用static修饰的SimpleDateFormat】调用format方法时,多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。比如有些时候想知道这个月的最后一天是几号、下个周末是几号,通过提供的时间和日期API可以很快得到答案。java8新的时间API的使用方式,包括创建、格式化、解析、计算、修改。

帅的刚刚好 864

海康/大华设备如何接入GB28181平台?最新2022版互联避坑指南

本文详细解析了海康/大华设备接入GB28181平台的最新2022版互联避坑指南,涵盖参数配置、实时视音频点播协议交互及典型故障排查。重点介绍了GB/T28181-2022标准下的设备编码规范、SIP服务器配置及媒体流保活机制,帮助工程团队高效解决设备离线和媒体流中断等问题。

weixin_30733003的博客 690

小波变换完全指南:从原理到实践的深度解析

在信号处理领域,傅里叶变换长期以来一直是频域分析的主要工具。然而,傅里叶变换存在一个根本性的局限:它只能告诉我们信号中包含哪些频率成分,却无法告诉我们这些频率成分在什么时刻出现。这就像是你知道一首歌用了哪些音符,却不知道这些音符的演奏顺序。小波变换(Wavelet Transform) 应运而生,它完美地解决了这个问题。小波变换不仅能够提供频率信息,还能同时提供时间信息,实现了信号的时频联合分析。本文将带你从零开始,深入理解小波变换的原理、实现和应用。傅里叶变换的定义如下: 它使用正弦和余弦这样的全局基函数

电脑管家 214

建议你使用LocalDateTime而不是Date

通过阅读本篇文章你将了解到: 为什么需要LocalDate、LocalTime、LocalDateTime【java8新提供的类】 java8新的时间API的使用方式,包括创建、格式化、解析、计算、修改 为什么需要LocalDate、LocalTime、LocalDateTime Date如果不格式化,打印出的日期可读性差 Tue Sep 10 09:34:04 CST 2019 复制代码 使用SimpleDateFormat对时间进行格式化,但SimpleDateFormat是线

dingding_java的博客 176

JAX/JAXlib GPU 加速版本安装教程(CUDA)

本文介绍了在Windows WSL2+Ubuntu22.04环境下配置JAX/JAXlib GPU加速版本的详细步骤。使用RTX 4060显卡,安装CUDA 12.4和cuDNN 8.9.7驱动,通过Miniconda创建Python 3.9虚拟环境。具体步骤包括:安装Miniconda、配置CUDA环境变量、安装cuDNN驱动、下载并安装JAX/JAXlib。最后通过测试代码验证GPU加速功能,成功检测到GPU并完成矩阵运算。整个过程配有详细命令和截图说明,适合需要搭建JAX GPU开发环境的用户参考。

猿小白的博客 629

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

在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗 通过阅读本篇文章你将了解到: 为什么需要LocalDate、LocalTime、LocalDateTime【java8新提供的类】 java8新的时间API的使用方式,包括创建、格式化、解析、计算、修改 为什么需要LocalDate、LocalTime、Local...

小小小跟班的博客 288

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

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

亲,建议你使用LocalDateTime而不是Date哦

在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗 通过阅读本篇文章你将了解到: 为什么需要LocalDate、LocalTime、LocalDateTime【java8新提供的类】 java8新的时间API的使用方式,包括创建、格式化、解析、计算、修改 (想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更...

wanghao112956的博客 697

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

我在想:阿里为什么建议使用LocalDateTime ,而不是 Date?

昨晚上,我又看了部分《阿里开发规范》,其中有一条是建议使用LocalDateTime ,而不是 Date?(文末送最新版《阿里开发规范》高清+目录)在项目开发过程中经常遇到时间处理,但是你...

田维常 1888
上一篇: 同事因在涉及金钱交易中使用double造成无法挽回的损失,已跑路
下一篇: 历史上最简单的一道Java面试题,但无人能通过
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值