java8新的时间日期库及使用示例

解决报错InvalidDefinitionException Java 8 date/time type LocalDateTime not supported by default jsr310 解决Spring boot2.5中出现的Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling问题 阅读详情

java8引入了一套全新的时间日期API,本篇随笔将说明学习java8的这套API。

java。time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中,下面是一些关键类

●Instant——它代表的是时间戳

●LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。

●LocalTime——它代表的是不含日期的时间

●LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。

●ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。

java8是如何处理时间及日期的

1、如何在java8中获取当天的日期

java8中有个叫LocalDate的类,能用来表示今天的日期。这个类与java.util.Date略有不同,因为它只包含日期,没有时间。

LocalDate today = LocalDate.now();
System.out.println("today is ----"+today);
 //today is ----2017-11-20


2、如何在java8中获取当前的年月日

LocalDate类中提供了一些很方便的方法可以用来提取年月日以及其他的日期属性,特别方便,只需要使用对应的getter方法就可以了,非常直观

       LocalDate today = LocalDate.now();
       int year = today.getYear();
       int month = today.getMonthValue();
       int day = today.getDayOfMonth();
       System.out.println("year:"+year);
       System.out.println("year:"+month);
       System.out.println("year:"+day);
       /* year:2017
        year:11
        year:20*/


 

3、在java8中如何获取某个特定的日期

通过另一个方法,可以创建出任意一个日期,它接受年月日的参数,然后返回一个等价的LocalDate实例。在这个方法里,需要的日期你填写什么就是什么,不想之前的API中月份必须从0开始

 

4、在java8中检查两个日期是否相等

LocalDate重写了equals方法来进行日期的比较,如下所示:

 

 

5、在java8中如何检查重复事件,比如生日

在java中还有一个与时间日期相关的任务就是检查重复事件,比如每月的账单日

如何在java中判断是否是某个节日或者重复事件,使用MonthDay类。这个类由月日组合,不包含年信息,可以用来代表每年重复出现的一些日期或其他组合。他和新的日期库中的其他类一样也都是不可变且线程安全的,并且它还是一个值类(value class)。

通过列子可以看到MonthDay只存储了月日,对比两个日期的月日即可知道是否重复

 

6、如何在java8中获取当前时间

这个与第一个例子获取当前日期非常相似,这里用的是LocalTime类,默认的格式是hh:mm:ss:nnn

可以看到,这个时间是不包含日期的

 

7、如何增加时间里面的小时数

很多时候需要对时间进行操作,比如加一个小时来计算之后的时间,java8提供了更方便的方法 如plusHours,这些方法返回的是一个新的LocalTime实例的引用,因为LocalTime是不可变的

 

8、如何获取1周后的日期

这个与前一个获取2小时后的时间的例子很相似,这里我们获取的是1周后的日期。LocalDate是用来表示无时间的日期,他又一个plus()方法可以用来增加日,星期,月,ChronoUnit则用来表示时间单位,LocalDate也是不可变的,因此任何修改操作都会返回一个新的实例

可以看到一周后的日期是什么,也可以用这个方法来增加一个月,一年,一小时,一分等等

 

9、一年前后的日期

 在上个例子中我们使用了LocalDate的plus()方法来给日期增加日周月,现在我们用minus()方法来找出一年前的那天

 

10、在java8中使用时钟

java8自带了Clock类,可以用来获取某个时区下(所以对时区是敏感的)当前的瞬时时间、日期。用来代替System.currentTimelnMillis()与TimeZone.getDefault()方法

 

11、在java中如何判断某个日期在另一个日期的前面还是后面

 如何判断某个日期在另一个日期的前面还是后面或者相等,在java8中,LocalDate类中使用isBefore()、isAfter()、equals()方法来比较两个日期。如果调用方法的那个日期比给定的日期要早的话,isBefore()方法会返回true。equals()方法在前面的例子中已经说明了,这里就不举例了

可以看到java8中比较日期非常简单,不再需要使用Calendar这样另外的类来完成类似的任务了

 

12、在java8中处理不同的时区

java8中不仅将日期和时间进行了分离,同时还有时区。比如ZonId代表的是某个特定时区,ZonedDateTime代表带时区的时间,等同于以前的GregorianCalendar类。使用该类,可以将本地时间转换成另一个时区中的对应时间。

注意:对应时区的文本可以直接手动填写,也可以调用定义好了的,手动填写的时候注意不可填错了,否则你会遇到下面的异常

13、如何表示固定的日期,比如信用卡过期时间

正如MonthDay表示的是某个重复出现的日子,YearMonth是另外一个组合,代表的是像信用卡还款日,定期存款到期日,options到期日这类的日期。你可以用这个类找出这个月有多少天,LengthOfMonth()这个方法返回的是这个YearMonth实例有多少天,这对于检查2月是否润2月很有用

14、如何在java8中检查闰年

LocalDate类由一个isLeapYear()方法来返回当前LocalDate对应的那年是否是闰年

 

15、两个日期之间包含多少天,多少月

计算两个日期之间包含多少天、周、月、年。可以用java.time.Period类完成该功能。下面例子中将计算日期与将来的日期之间一共有几个月

 

16、带时区的日期与时间

在java8中,可以使用ZoneOffset来代表某个时区,可以使用它的静态方法ZoneOffset.of()方法来获取对应的时区,只要获得了这个偏移量,就可以用这个偏移量和LocalDateTime创建一个新的OffsetDateTime

可以看到现在时间日期和时区关联上了,注意OffsetDateTime主要是用来给机器理解的,平时使用就用前面结束的ZoneDateTime类就可以了

 

17、在java8中获取当前时间戳

java8获取时间戳特别简单。Instant类由一个静态的工厂方法now()可以返回当前时间戳

可以看到,当前时间戳是包含日期和时间的,与java.util.Date很类似,事实上Instant就是java8以前的Date,可以使用这个两个类中的方法在这两个类型之间进行转换,比如Date.from(Instant)就是用来把Instant转换成java.util.date的,而Date。toInstant()就是将Date转换成Instant的

 

18,如何在java8中使用预定义的格式器来对日期进行解析/格式化

在java8之前,时间日期的格式化非常麻烦,经常使用SimpleDateFormat来进行格式化,但是SimpleDateFormat并不是线程安全的。在java8中,引入了一个全新的线程安全的日期与时间格式器。并且预定义好了格式。比如,本例中使用的BASICISODATE格式会将20160414格式化成2016-04-14

在DateTimeFormatter中还有很多定义好的格式,有兴趣的可以自己去看一下

 

19、如何在java中使用自定义的格式器来解析日期

 在上例中,我们使用了预置的时间日期格式器来解析日期字符串了,但是有时预置的不能满足的时候就需要我们自定义日期格式器了,下面的例子中的日期格式是"MM dd yyyy".你可以给DateTimeFormatter的ofPattern静态方法()传入任何的模式,它会返回一个实例,这个模式的字面量与前例中是相同的。比如M代表月,m仍代表分,无效的模式会抛异常DateTimeParseException。

 

20、如何在java8中对日期进行格式化,转换成字符串

 前面的两个例子中,我们主要是对日期字符串来进行解析转换成日期,在这个例子我们相反,是把日期转换成字符。这里我们有个LocalDateTime类的实例,我们要把他转换成一个格式化好的日期串,与前例相同的是,我们仍需要制定模式串去创建一个DateTimeFormatter类的实例,但调用的是LocalDate.format()。这个方法会返回一个代表当前日期的字符串,对应的模式就是传入的DateTimeFormatter实例中定义好的。


21,Date与LocalDate的转换

Date date = new Date();
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        // atZone()方法返回在指定时区从此Instant生成的ZonedDateTime。
        LocalDate localDate = instant.atZone(zoneId).toLocalDate();
        System.out.println("Date = " + date);
        System.out.println("LocalDate = " + localDate);
       /* Date = Mon Nov 20 09:58:50 CST 2017
        LocalDate = 2017-11-20*/

ZoneId zoneId = ZoneId.systemDefault();
        LocalDate localDate = LocalDate.now();
        ZonedDateTime zdt = localDate.atStartOfDay(zoneId);
        Date date = Date.from(zdt.toInstant());
        System.out.println("LocalDate = " + localDate);
        System.out.println("Date = " + date);
        /*LocalDate = 2017-11-20
        Date = Mon Nov 20 00:00:00 CST 2017*/


java8中日期与时间API的几个关键点

经过上面的例子,我们已经对java8的时间日期有了一定的了解,现在回顾一下

 

●它提供了javax.time.ZoneId用来处理时区。

●它提供了LocalDate与LocalTime类

●Java 8中新的时间与日期API中的所有类都是不可变且线程安全的,这与之前的Date与Calendar API中的恰好相反,那里面像java.util.Date以及SimpleDateFormat这些关键的类都不是线程安全的。

●新的时间与日期API中很重要的一点是它定义清楚了基本的时间与日期的概念,比方说,瞬时时间,持续时间,日期,时间,时区以及时间段。它们都是基于ISO日历体系的。

 

每个Java开发人员都应该至少了解这套新的API中的这五个类:

●Instant 它代表的是时间戳,比如2016-04-14T14:20:13.592Z,这可以从java.time.Clock类中获取,像这样: Instant current = Clock.system(ZoneId.of("Asia/Tokyo")).instant();

●LocalDate 它表示的是不带时间的日期,比如2016-04-14。它可以用来存储生日,周年纪念日,入职日期等。

●LocalTime - 它表示的是不带日期的时间

●LocalDateTime - 它包含了时间与日期,不过没有带时区的偏移量

●ZonedDateTime - 这是一个带时区的完整时间,它根据UTC/格林威治时间来进行时区调整

●这个库的主包是java.time,里面包含了代表日期,时间,瞬时以及持续时间的类。它有两个子package,一个是java.time.foramt,这个是什么用途就很明显了,还有一个是java.time.temporal,它能从更低层面对各个字段进行访问。

●时区指的是地球上共享同一标准时间的地区。每个时区都有一个唯一标识符,同时还有一个地区/城市(Asia/Tokyo)的格式以及从格林威治时间开始的一个偏移时间。比如说,东京的偏移时间就是+09:00。

●OffsetDateTime类实际上包含了LocalDateTime与ZoneOffset。它用来表示一个包含格林威治时间偏移量(+/-小时:分,比如+06:00或者 -08:00)的完整的日期(年月日)及时间(时分秒,纳秒)。

●DateTimeFormatter类用于在Java中进行日期的格式化与解析。与SimpleDateFormat不同,它是不可变且线程安全的,如果需要的话,可以赋值给一个静态变量。DateTimeFormatter类提供了许多预定义的格式器,你也可以自定义自己想要的格式。当然了,根据约定,它还有一个parse()方法是用于将字符串转换成日期的,如果转换期间出现任何错误,它会抛出DateTimeParseException异常。类似的,DateFormatter类也有一个用于格式化日期的format()方法,它出错的话则会抛出DateTimeException异常。

●再说一句,“MMM d yyyy”与“MMm dd yyyy”这两个日期格式也略有不同,前者能识别出"Jan 2 2014"与"Jan 14 2014"这两个串,而后者如果传进来的是"Jan 2 2014"则会报错,因为它期望月份处传进来的是两个字符。为了解决这个问题,在天为个位数的情况下,你得在前面补0,比如"Jan 2 2014"应该改为"Jan 02 2014"。

 

关于Java 8这个新的时间日期API就讲到这了。这几个简短的示例 对于理解这套新的API中的一些新增类已经足够了。我们学习了如何创建与修改日期实例。我们还了解了纯日期,日期加时间,日期加时区的区别,知道如何比较两个日期,如何找到某天到指定日期比如说下一个生日,周年纪念日或者保险日还有多少天。我们还学习了如何在Java 8中用线程安全的方式对日期进行解析及格式化,而无需再使用线程本地变量或者第三方库这种取巧的方式。新的API能胜任任何与时间日期相关的任务。

解决SpringBoot日期序列化问题:[Java 8 date/time type `java.time.LocalDateTime` not supported by default] Java 8 date/time type `java.time.LocalDateTime` not supported by default 阅读详情

相关推荐

解决:Java 8 date/time type `java.time.LocalDate` not supported by default

报错原因是在序列化对象时涉及到 Java 8 的日期/时间类型 java.time.LocalDate,但默认情况下 Jackson 不支持这种类型。要解决这个问题,可以添加 Jackson 模块 “com.fasterxml.jackson.datatype:jackson-datatype-jsr310”,以启用对 Java 8 日期/时间类型的支持。在 Maven 项目中pom.xml 文件中添加以下依赖。

后端开发 4411

Java 8 datetime type `java.time.LocalDateTime` not supported by default add Module com.fasterxml.jac

之前的项目好好的,突然报Java 8 date/time typenot supported by default: add Module “com.fasterxml.jackson.datatype:jackson-datatype-jsr310” to enable handling错误,

冰之杍的博客 3521

AI人工智能全模态大模型架构:推动智能交通发展的架构设计

本文旨在阐述全模态大模型在智能交通领域的架构设计原理和应用方法。我们将探讨如何利用多模态AI技术解决交通流量预测、事故预警、路线优化等关键问题。文章将从基础概念入手,逐步深入技术细节,最后探讨实际应用和未来发展方向。全模态大模型:能够处理和理解多种数据模态(如图像、文本、语音等)的大型AI模型智能交通系统(ITS):利用先进技术优化交通流量和安全性的综合系统多模态融合:将不同数据源的信息整合处理的技术核心概念回顾全模态大模型是能够处理多种数据类型的强大AI系统。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 834

【常见问题】Java 8 date/time type `java.time.LocalDateTime` not supported by default:日期序列化问题

首先,我们需要创建一个自定义的序列化器,用于处理LocalDateTime类型的序列化和反序列化。} }} }} }} }import com} }} }} }import com} }} }} }} }} }@Override在这个自定义序列化器中,我们将LocalDateTime对象转换为字符串,然后使用方法将其写入JSON输出流。

木头大左的博客 6120

《Ventoy 制作系统安装 U 盘的具体步骤》

然后您可以在电脑的磁盘管理中对 U 盘进行快速格式化,选择 FAT32 或 NTFS 文件系统。至此,Ventoy 系统安装 U 盘就制作完成了。您可以在需要安装系统的电脑上,从 U 盘启动,然后选择相应的系统镜像进行安装。安装完成后,将您需要的操作系统镜像文件(如 Windows、Linux 等的 ISO 格式镜像)复制到 U 盘的根目录。在安装程序中,选择您插入的 U 盘设备,确保选择正确,以免误操作。2. 确认选择的 U 盘盘符正确,防止误操作导致其他磁盘数据丢失。点击“安装”按钮,等待安装完成。

jiyiwangluokeji的博客 2668

在VS2019里把JSBSim飞行模型集成到你的C++项目里(附完整配置流程和常见错误解决)

本文详细介绍了如何在Visual Studio 2019中将JSBSim飞行模型集成到C++项目中,包括环境准备、源码编译、项目配置和常见错误解决方案。通过实战技巧和优化建议,帮助开发者高效实现高精度飞行仿真功能,提升开发效率。

weixin_42620202的博客 413

精选(40) Java 8新的时间日期库的20个使用示例

Java 8新的时间日期库的20个使用示例 Java 8是如何处理时间及日期的 有人问我学习一个新库的最佳途径是什么?我的回答是,就是在实际项目中那样去使用它。在一个真实的项目中会有各种各样的需求,这会促使开发人员去探索和研究这个新库。简言之,只有任务本身才会真正促使你去探索及学习。java 8的新的日期及时间API也是一样。为了学习Java 8的这个新库,这里我创建了20个以任务为导向的例子。我...

cowbin2012的专栏 1万+

电子结构设计(EMD)十年知识总结

客官,你的面相是做结构设计的奇才~1. 材料选择【一出手的0.1s就败了】2. 钣金件设计【折来折去有啥难】3. 塑胶件设计【看着好复杂】4. 型材件设计【凭啥不让我设计】5. 电子结构(PCBA)设计【静电肿么要我背锅】6. 包装设计【要的就是金玉其外,败絮其中】7. 外观(工业)设计【好不好看,谁说了算】8. 标签设计【】9. 标准件选择【一个螺丝难倒英雄汉/提起螺丝,英雄气短】10. 计算仿...

wfeng86的博客 1569

Java 8新的时间日期库的20个使用示例

Java 8新的时间日期库的20个使用示例一、 如何 在Java 8中获取当天的日期二、 如何在Java 8中获取当前的年月日三、在Java 8中如何获取某个特定的日期四、在Java 8中如何检查两个日期是否相等五、在Java 8中如何检查重复事件,比如说生日六、如何在Java 8中获取当前时间七、如何增加时间里面的小时数八、如何获取1周后的日期九、一年前后的日期十、在Java 8中使用时钟十一、...

rootlh的博客 352

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测 目录时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测基本介绍ARIMAXVARVARMAVARMAXSESHWES参考资料 基本介绍 本文介绍ARIMAX、VAR、VARMA和VARMAX基本概念及其Python程序设计。 ARIMAX 具有外源回归量的自回归整合移动平均值(ARIMAX)是 ARIMA 模型的扩展,其还包括外生变量的建模。 外生变量也称为协变量,可以被认为是并行输入序列,其在与

前程算法屋的博客 6688

基于simulink的预测电流控制策略的三相逆变器仿真

本文详细介绍了在Simulink中实现基于预测电流控制策略的三相逆变器仿真方法。主要内容包括:准备工作(安装必要软件及工具箱)、构建三相逆变器基础模型、设计预测电流控制器(包含状态空间建模和控制器设计)、实现控制逻辑、添加示波器观察输出、配置仿真参数以及运行仿真分析结果。通过MATLAB代码示例和Simulink模块说明,展示了如何选择最优开关状态来最小化电流误差。该仿真方法为研究快速响应、高精度的逆变器控制提供了实用工具,但需注意实际应用中可能需要的调试工作。

amy_mhd的博客 274

Java8中时间日期库的20个常用使用示例

在Java 8之前,时间日期的格式化可是个技术活,我们的好伙伴SimpleDateFormat并不是线程安全的,而如果用作本地变量来格式化的话又显得有些笨重。多亏了线程本地变量,这使得它在多线程环境下也算有了用武之地,但Java维持这一状态也有很长一段时间了。这次它引入了一个全新的线程安全的日期与时间格式器。它还自带了一些预定义好的格式器,包含了常用的日期格式。比如说,本例 中我们就用了预定义的BASICISODATE格式,它会将2014年2月14日格式化成20140114。

weiye2012的博客 990

【Claude】API Error 通用错误:错误码含义与标准排查流程 bug报错已解决

Claude API 各类错误码速查与标准排查流程。

博客 8243

java system datetime_Java8新特性时间日期库DateTime API及示例

Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理。同样的,如果你现在依旧在项目中使用传统Date、Calendar和SimpleDateFormat等API来处理日期相关操作,这篇文章你一定不要错过。来刷新你的知识库吧!背景Java对日期、日历及时间的处理一直以来都饱受诟病,比如java.util.Date和java.util.Calendar类易用性差...

weixin_35110266的博客 189

解锁RK平台黑科技:DPDK加速与硬件卸载实战

本文探讨了在RK平台上通过DPDK加速与硬件卸载技术构建高性能网络架构的方法。RK平台凭借强大的硬件性能为高并发网络处理提供基础,而DPDK通过用户态驱动、轮询机制等技术绕过内核瓶颈,显著提升数据包处理效率。硬件卸载则将校验和计算等任务交由专用硬件,释放CPU资源。实践案例显示,该方案可使网络吞吐量提升至理论极限,延迟降至5ms以下,CPU利用率降低40%。文章详细介绍了配置步骤、优化方法和常见问题解决方案,并展望了该技术在5G、车联网等新兴领域的应用前景。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1279

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java8新特性时间日期库DateTime API及示例

Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理。同样的,如果你现在依旧在项目中使用传统Date、Calendar和SimpleDateFormat等API来处理日期相关操作,这篇文章你一定不要错过。来刷新你的知识库吧! 背景 Java对日期、日历及时间的处理一直以来都饱受诟病,比如java.util.Date和java.util.Calendar类易用...

程序新视界 4672

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LocalDate LocalTime java8新的时间日期库及使用示例

java8引入了一套全新的时间日期API,本篇随笔将说明学习java8的这套API。 java。time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中,下面是一些关键类 ●Instant——它代表的是时间戳 ●LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。 ●LocalTime——它代表的是不含日期的...

liang只的博客 1494

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java 8 时间日期库的20个使用示例

除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API。Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的。看来Java已经意识到需要为时间及日期功能提供更好...

ARookie001的博客 210

java 8 时间日期库及使用示例

java8引入了一套全新的时间日期API,本篇随笔将说明学习java8的这套API。 java。time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中,下面是一些关键类 ●Instant——它代表的是时间戳 ●LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。 ●LocalTime——它代表...

JKjiang123的博客 304
上一篇: mybatis中的mapper.xml文件中#,$的区别
下一篇: 桑基图(sankey)的绘制
Tracyclock
博客等级 码龄10年 14粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值