一文详解Java LocalDateTime 一文详解卓依婷现状
xsobi 2024-12-17 17:07 22 浏览
逃离“时光旋涡” —— 从一次Date对象的“时区迷航”说起
想象一下,你的项目正紧锣密鼓地推进,突然间,一个看似不起眼的日期处理任务,却引发了一场“完美风暴”。一个简单的任务需求:存储用户生日并按其所在时区显示。使用传统的java.util.Date,你以为只需寥寥数行代码即可轻松搞定,却不料踏入了一个布满陷阱的雷区。时区转换的微妙差异,导致存储的生日莫名其妙地“漂移”了一天;线程并发下的不稳定性,又让日期数据的准确性如履薄冰。这不仅仅是一个技术问题,更成为了影响用户体验的“阿喀琉斯之踵”。
Java 8引入了全新的日期时间API (java.time包),彻底革新了日期和时间的处理方式,其中LocalDateTime、LocalDate、LocalTime三大类更是成为开发者手中的得力工具。遗憾的是,在java LTS版本已经发展到21的今天,Java 8引入的日期时间的类还未被大多数开发者熟练使用,本文会阐述这些又“新”又“旧”的类的基本用法,快来看看你都”学废“了吗?
LocalDateTime 时间与日期的完美融合
在Java 8中,LocalDateTime类作为java.time包的一员,标志着日期和时间处理的新篇章。它结合了LocalDate的日期信息和LocalTime的时间信息,提供了一个不含时区信息的日期时间表示方式,适用于那些只需要关注本地日期和时间,而不需要考虑时区差异的场景。
创建
LocalDateTime代表的是一个没有时区信息的日期和时间组合,适用于记录或显示本地日期和时间,比如会议安排、生日提醒等。创建LocalDateTime实例可以通过多种方式:
- 当前日期时间:LocalDateTime now = LocalDateTime.now(); 获取当前系统默认时区的日期和时间。
- 指定日期时间:LocalDateTime dt = LocalDateTime.of(2024, Month.JANUARY, 1, 12, 30); 创建特定的日期和时间。
- 字符串解析:LocalDateTime parsed = LocalDateTime.parse("2024-01-01T12:30"); 从ISO 8601标准格式的字符串解析日期时间。
访问与修改
LocalDateTime提供了丰富的getter方法用于访问日期和时间的各个组成部分,如getYear(), getMonth(), getDayOfMonth(), getHour(), getMinute()等。同时,它还支持对日期时间进行调整:
- 日期调整:如withDayOfMonth(15)将日期调整到当月的15号。
- 时间调整:如plusHours(2)表示加上2小时。
操作与计算
LocalDateTime提供了加减日期或时间的方法,允许进行日期时间的计算:
- 加减日期时间:LocalDateTime future = dt.plusDays(10); 计算10天后的日期时间。
- 计算两个日期时间的差距:结合Duration或Period可以计算两个LocalDateTime之间的差异。
格式化与解析
为了适应不同的展示或存储需求,LocalDateTime支持自定义格式化和解析:
- 格式化输出:DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formatted = dt.format(formatter); 格式化为指定样式。
- 解析字符串:LocalDateTime fromString = LocalDateTime.parse("2023-01-01 12:30", formatter); 将格式化的字符串解析回LocalDateTime。
与时间相关的转换
虽然LocalDateTime不包含时区信息,但可以与其他包含时区的类(如ZonedDateTime)进行转换,以便在全球范围内使用:
- 结合时区:通过ZonedDateTime zdt = dt.atZone(ZoneId.systemDefault()); 将本地日期时间转换为特定时区的日期时间。
- 去除时区信息:从ZonedDateTime转换回LocalDateTime,可以使用zdt.toLocalDateTime()。
注意事项
- 时区意识:虽然LocalDateTime不携带时区信息,但在处理跨国或跨时区的数据时,应考虑使用ZonedDateTime以避免混淆。
- 不可变性:如同LocalDate和LocalTime,LocalDateTime也是不可变的,所有修改操作都会返回一个新的实例。
- 线程安全:由于不可变性,LocalDateTime是线程安全的,适合在并发环境下使用。
LocalDate、LocalTime:日期与时间的纯粹表达
在Java 8中,除了全能的LocalDateTime,java.time包还为我们带来了两位专注于单一维度的勇士——LocalDate和LocalTime。它们分别负责处理无时间的日期和无日期的时间信息,以其简洁而强大的设计,解决了众多日期时间处理中的痛点。接下来,让我们并肩探索LocalDate和LocalTime的奥秘,了解它们如何在各自的领域内大放异彩。
LocalDate:纯粹的日期
LocalDate代表不含时间信息的日期,专注于年月日的管理,非常适合处理生日、纪念日、合同截止日期等场景。
- 创建与获取:通过LocalDate.now()获取当前日期,或者使用LocalDate.of(2023, Month.JANUARY, 1)指定日期。
- 日期操作:轻松进行日期的加减,如LocalDate tomorrow = today.plusDays(1)获取明天的日期。
- 比较与判断:提供isBefore(), isAfter(), isEqual()等方法,方便比较日期先后。
- 格式化与解析:与DateTimeFormatter结合,实现日期的自定义格式化输出和解析。
LocalTime:时间的精准表达
LocalTime专注于处理一天中的时间,没有日期信息,适用于记录营业时间、事件发生的具体时间点。
- 初始化与获取:使用LocalTime.now()获取当前时间,或LocalTime.of(14, 30)指定具体时间。
- 时间调整:通过plusHours(), minusMinutes()等方法,实现对时间的加减操作。
- 比较与计算:提供方法来比较时间的早晚,以及计算两个时间点的差距,使用Duration来表示时间差。
- 格式化与解析:同样支持与DateTimeFormatter的配合,进行时间的格式化输出和解析。
相互转换与应用场景
- 相互结合:LocalDateTime实际上就是LocalDate和LocalTime的组合体,通过LocalDateTime.of(date, time)或各自类的atTime()、atDate()方法可以互相转换。
- 专注单一维度:在处理特定场景时,单独使用LocalDate或LocalTime可以避免不必要的复杂性,提高代码的可读性和维护性。
- 时区无关性:两者都不包含时区信息,适合处理与特定时区无关的日期或时间信息。
注意事项
- 时区意识:虽然LocalDate和LocalTime不包含时区信息,但在处理跨越时区的数据时,应考虑使用ZonedDateTime。
- 不可变性与线程安全:与LocalDateTime类似,LocalDate和LocalTime也是不可变类,所有修改操作返回新实例,保证了线程安全。
- 精确计算:进行日期时间的加减操作时,应考虑使用Period和Duration来精确表达时间跨度。
LocalDateTime、LocalDate、LocalTime vs java.util.Date
相较于传统的java.util.Date类,在设计哲学、功能特性以及易用性上实现了显著的飞跃。以下是它们相对于Date类的主要优势:
明确的职责划分
- LocalDate和LocalTime分别专注于日期和时间的处理,这种分离使得模型更加清晰,避免了在单一对象中混合日期和时间信息可能导致的混淆。
- LocalDateTime虽然综合了日期和时间,但其设计初衷就是为了清晰地处理含有日期和时间信息的场景,相比Date类的多功能混杂,使用起来更为直观。
不可变性与线程安全
- 所有java.time类,包括LocalDateTime、LocalDate、LocalTime,均为不可变对象。这意味着一旦创建,它们的值就不会改变,这有助于在并发环境下保持数据的一致性,而Date类则是可变的,容易在多线程环境下引起数据竞争问题。
丰富的API设计
- 新API提供了更丰富且直观的操作方法,如日期时间的加减、比较、格式化等,避免了Date类中繁琐且容易出错的日期时间计算。
- 例如,LocalDate.plusDays()直接增加了天数,而Date类需要通过Calendar类间接操作,过程更为复杂。
时区处理的明确性
- 虽然LocalDateTime、LocalDate、LocalTime本身不包含时区信息,但这实际上是为了清晰地区分本地时间与全球时间的概念。对于需要时区处理的场景,Java 8提供了ZonedDateTime类,它比Date类的时区处理更为灵活和精确。
- 相比之下,Date类虽然包含时区信息,但处理时区问题时往往显得笨拙且不够明确。
ISO 8601标准遵循
- LocalDateTime、LocalDate、LocalTime在格式化和解析上遵循ISO 8601国际标准,如YYYY-MM-DD和HH:mm:ss,这使得日期时间的字符串表示更加通用和标准化,便于跨系统和国际化应用。
- 而Date类的默认字符串表示并不遵循任何标准格式,需要手动格式化和解析,增加了复杂度。
性能与精确性
- java.time包采用了更高效的设计,尤其是对于日期时间的计算和存储,相比Date类在性能上有一定的提升。
- 此外,新API提供了纳秒级的精度,而Date类的精度仅为毫秒级,对于需要极高时间精度的应用来说,这是一个显著的进步。
总结
可以看到,这些JDK8引入的Localxxx类,都可以让我们对日期和时间的处理更加准确和方便,虽然继续使用java.util.Date也在多数场景可以满足需求,让我想起一张远古的图
不过在不同的场景使用最适合的类和方法,尽量把代码写的简洁和优雅,才是一个程序猿不断追求的目标吧。
看到这里了,点个赞再走呗
原文:https://juejin.cn/post/7394345043131858970
作者:podongfeng
相关推荐
- 推荐几款 Webshell 查杀工具 PHP、Python、JSP、ASP、JS、HTML、Apk
-
Webshell会严重威胁到网站的安全性,webshell木马可以任意修改网站文件内容,查看系统环境、执行脚本、提权等等,甚至可以严重威胁数据库的安全。作为一名站长,定期检查网站文件安全是必不可少的...
- Visual Studio Code安装C#开发工具包并编写ASP.NET Core Web应用
-
前言前段时间微软发布了适用于VSCode的C#开发工具包(注意目前该包还属于预发布状态但是可以正常使用),因为之前看过网上的一些使用VSCode搭建.NETCore环境的教程看着还挺复杂的就一...
- DevExpress Demo示例展示:ASP.NET MVC报表无与伦比的设计时体验
-
DevExpressASP.NETMVCReporting原生集成DevExpressASP.NETMVC扩展以及无与伦比的设计时生产力。下面几个典型示例展示了它强大的设计时功能,Web报...
- 在ubuntu下新建asp.net core项目(ubuntu创建swap)
-
本文一步步讲述在ubuntu下用visualstudiocode创建asp.netcore项目的过程。step1:环境操作系统:virtualbox下安装的lubuntu。请不要开启“硬件...
- Asp.net常用方法及request和response-a
-
asp.net教程asp.net常用方法:1、Request.UrlReferrer请求的来源,可以根据这个判断从百度搜的哪个关键词、防下载盗链、防图片盗链,可以伪造(比如迅雷)。(使用全局一般处理...
- 「B/S端开发」DevExtreme初级入门教程 - ASP.NET MVC 5控件简介
-
欢迎阅读了解DevExtremeASP.NETMVC5控件有关的文档!DevExtremeCompleteSubscription官方最新版免费下载试用,历史版本下载,在线文档和帮助文件下...
- 微软跨平台开源.Net Core与ASP.Net已可用于生产环境
-
周三在举行Connect2015的同时,微软升级了.NetCore和ASP.Net,开发者可以开始在生产环境使用微软开源的.NetCore跨平台框架和ASP.NetWeb平台。微软发布了.Net...
- 用ASP生成Excel数据三种方法(asp生成word)
-
可能是将一个html表格变成MicrosoftExcel格式的最快方法。ContentType属性通知浏览器数据要被格式化为何种格式,在这里我们要的格式是MicrosoftExcel。当浏...
- 个人web开发我选Asp.net core,你选谁?PHP?还是JSP?
-
现在很多公司都会选用PHP,JSP来开发,但是现在Asp.netcore已经今非昔比了。今天微软金牌合作伙伴51aspx来分享一些关于.Net的那点事。.Net以前是不开源的,需要收费,有着各种版权...
- 创建第一个ASP.NET Core WebService程序
-
要创建第一个ASP.NETCoreWebService程序,可以按照以下步骤进行:1、安装.NETCoreSDK:首先,确保已在计算机上安装了最新版本的.NETCoreSDK。可以从Mic...
- 网站收录,网站收录方法技巧,网站收录入口(图文教程)
-
网站收录,是网站参与排名的前提,搜索引擎会先收录网站到自己的索引库里,然后根据算法计算出排名结果。也就是说,搜索引擎不收录的网站没有任何获得排名的机会。所以,我们需要关注自身网站收录情况。网站收录指的...
- 黑客通过Kali Linux设置一个钓鱼网站原来这么简单
-
一、背景介绍钓鱼网站是指欺骗用户的虚假网站。“钓鱼网站”的页面与真实网站界面基本一致,欺骗消费者或者窃取访问者提交的账号和密码信息。钓鱼网站一般只有一个或几个页面,和真实网站差别细微。钓鱼网站是互联网...
- 快速将网站从HTTP升级到HTTPS教程
-
在当今社会,每个人都离不开互联网,网络的安全性变得越来越重要,将网站从HTTP协议升级到HTTPS协议已成为保护用户数据安全和提高网站信任度的必要步骤,HTTPS不仅加密了用户与服务器之间的数据传输,...
- 从学习硬件知识到选电脑配置再到电脑组装教程及系统安装-导航篇
-
对于准备想要装机的小白来说,可能会在网上找各种关于硬件知识文章,或者直接找适合自己的组装电脑配置清单,电脑组装教程以及系统安装教程等,但其实装机之家网站上有着大量关于这类文章,就是由于文章过多,导致了...
- 10个顶级的office学习网站,5天让你菜鸟变大神,月薪过万不用愁
-
现在有很多小伙伴在工作的时候,都需要用到各种office办公软件。但是对于很多职场小白来说,想要很好的掌握office真的不是一件简单的事情。别担心,今天小编将推荐10个优质的office学习网站给大...
- 一周热门
- 最近发表
-
- 推荐几款 Webshell 查杀工具 PHP、Python、JSP、ASP、JS、HTML、Apk
- Visual Studio Code安装C#开发工具包并编写ASP.NET Core Web应用
- DevExpress Demo示例展示:ASP.NET MVC报表无与伦比的设计时体验
- 在ubuntu下新建asp.net core项目(ubuntu创建swap)
- Asp.net常用方法及request和response-a
- 「B/S端开发」DevExtreme初级入门教程 - ASP.NET MVC 5控件简介
- 微软跨平台开源.Net Core与ASP.Net已可用于生产环境
- 用ASP生成Excel数据三种方法(asp生成word)
- 个人web开发我选Asp.net core,你选谁?PHP?还是JSP?
- 创建第一个ASP.NET Core WebService程序
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- characterencodingfilter (33)
- getmonth (34)
- label换行 (33)
- android studio 3 0 (34)
- html转js (35)
- 索引的作用 (33)
- checkedlistbox (34)
- xmlhttp (35)
- mysql更改密码 (34)
- 权限777 (33)
- htmlposition (33)
- 学校网站模板 (34)
- textarea换行 (34)
- 轮播 (34)
- asp net三层架构 (38)
- bash (34)