【JDK8新特性之日期时间API-案例实操】

news2024/11/25 5:01:30

一.JDK8新特性之日期时间API-案例实操

之前我们学习了Stream流、Lambda表达式以及方法引用等相关的内容,如果想学习的同学可以看一下之前的文章,接下来我们一起学习一下关于JDK8中新日期时间API的使用。

在这里插入图片描述

二.JDK中原始日期时间存在的问题

  1. 设计不合理,没有一个统一衡量的标准,在java.util和java.sql的包各自中都有日期类。
  2. 非线程安全,所有的日期类都是可变的。
  3. 不提供时区支持。

三. JDK8新特性之新日期时间API

JDK 8中全新的日期时间API,是线程安全的。新的日期及时间API位于 java.time 包中,以下是关于日期时间关键类API。

  • LocalDate :表示日期,包含年月日,格式为 2019-10-16
  • LocalTime :表示时间,包含时分秒,格式为 16:38:54.158549300
  • LocalDateTime :表示日期时间,包含年月日,时分秒,格式为 2018-09-06T15:33:56.750
  • DateTimeFormatter :日期时间格式化类。
  • Instant:时间戳,表示一个特定的时间瞬间。
  • Duration:用于计算2个时间(LocalTime,时分秒)的距离
  • Period:用于计算2个日期(LocalDate,年月日)的距离
  • ZonedDateTime :包含时区的时间

Java中使用的历法是ISO 8601日历系统,它是世界民用历法,也就是我们所说的公历。平年有365天,闰年是366
天。此外Java 8还提供了4套其他历法,分别是:

  • ThaiBuddhistDate:泰国佛教历
  • MinguoDate:中华民国历
  • JapaneseDate:日本历
  • HijrahDate:伊斯兰历

3.1 日期时间的常见操作以及案例实操

3.1.1 LocalDate创建指定的日期

案例代码

import java.time.LocalDate;

public class Demo {

    public static void main(String[] args) {
        // 创建指定的日期
        LocalDate date = LocalDate.of(2023, 2, 26);
        System.out.println("创建指定的日期为 "+date);

        // 得到当前的日期
        LocalDate now = LocalDate.now();
        System.out.println("当前的时间为  "+now);

        // 根据LocalDate对象获取对应的日期信息
        System.out.println("年:" + now.getYear());
        System.out.println("月:" + now.getMonth().getValue());
        System.out.println("日:" + now.getDayOfMonth());
        System.out.println("星期:" + now.getDayOfWeek().getValue());
    }
}

结果展示:
在这里插入图片描述

3.1.2 LocalTime创建指定的时间

案例代码

import java.time.LocalTime;

public class Demo {
    
    public static void main(String[] args) {
        // 指定的时间
        LocalTime time = LocalTime.of(6,6,6,666);
        System.out.println("设置指定的时间为"+time);

        // 获取当前的时间
        LocalTime nowtime = LocalTime.now();
        System.out.println("获取当前的时间"+nowtime);
        // 获取时间信息:小时、分钟、秒、纳秒等相关的信息
        System.out.println(nowtime.getHour());
        System.out.println(nowtime.getMinute());
        System.out.println(nowtime.getSecond());
        System.out.println(nowtime.getNano());
    }
}

运行结果
在这里插入图片描述

3.1.1 LocalDateTime创建指定的日期和时间

就是之前日期类和时间类的增强版本
案例代码

import java.time.LocalDateTime;

public class Demo {

    public static void main(String[] args) {
        // 设置指定的日期时间
        LocalDateTime dateTime = LocalDateTime.of(2023
                        , 9
                        , 01
                        , 9
                        , 10
                        , 10
                        , 910);
        System.out.println("设置指定日期的时间为:"+dateTime);
        // 获取当前的日期时间
        LocalDateTime nowTime = LocalDateTime.now();
        System.out.println("获取当前的日期时间:"+nowTime);
        // 获取日期时间信息
        System.out.println(nowTime.getYear());
        System.out.println(nowTime.getMonth().getValue());
        System.out.println(nowTime.getDayOfMonth());
        System.out.println(nowTime.getDayOfWeek().getValue());
        System.out.println(nowTime.getHour());
        System.out.println(nowTime.getMinute());
        System.out.println(nowTime.getSecond());
        System.out.println(nowTime.getNano());
    }
}

运行结果
在这里插入图片描述

3.2 日期时间的修改和比较

3.2.1 原来的时间上设置新时间,并不会修改原来时间的相关信息

修改日期时间 对日期时间的修改,对已存在的LocalDate对象,新创建了对象,相当于拷贝了原来的时间对象,它并不会修改原来的信息。

案例代码

import java.time.LocalDateTime;

public class Demo {

    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println("现在的时间: "+now);
        // 设置时间为1998 注意:此时获得是另一个对象相关的时间,原来的时间并没有改变
        LocalDateTime localDateTime = now.withYear(1998);
        System.out.println("还是现在的时间,并没有改变:"+now);
        System.out.println("修改后的时间" + localDateTime);
    }
}

结果展示:

在这里插入图片描述

3.2.2 日期时间的设置与修改

案例代码

import java.time.LocalDateTime;

public class Demo {

    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println("现在的时间: "+now);
        // 设置时间为1998 注意:此时获得是另一个对象相关的时间,原来的时间并没有改变
        LocalDateTime localDateTime = now.withYear(2001);
        System.out.println("还是现在的时间,并没有改变:"+now);
        System.out.println("修改后的时间" + localDateTime);


        // 在当前日期时间的基础上 加上或者减去指定的时间
        System.out.println("5年后:"+now.plusYears(5));
        System.out.println("5月后:"+now.plusMonths(5));
        System.out.println("5天后:"+now.plusDays(5));
        System.out.println("5年前:"+now.minusYears(5));
        System.out.println("5月前:"+now.minusMonths(5));
        System.out.println("5天前:"+now.minusDays(5));
    }
}
   

运行结果
在这里插入图片描述

3.2.3 日期时间的比较

在JDK8中日期的比较的相关API方法:isAfter 、isBefore、 isEqual
实现案例

import java.time.LocalDateTime;

public class Demo {

    public static void main(String[] args) {
        LocalDateTime before = LocalDateTime.of(2022,2,3,5,4,2,123);
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now.isAfter(before));
        System.out.println(now.isBefore(before));
        System.out.println(now.isEqual(before));
    }
}

运行结果
在这里插入图片描述

3.3 格式化和解析操作

在JDK8中我们可以通过java.time.format.DateTimeFormatter类可以进行日期的解析和格式化操作

案例代码

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Demo {

    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        // DateTimeFormatters时间格式化类来指定时间被格式化的格式
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String format = now.format(dateTimeFormatter);
        System.out.println("格式化后的时间为:" + format);

    }
}

运行结果
在这里插入图片描述

3.4 Instant类

在JDK8中给我们新增一个Instant类(时间戳/时间线),内部保存了从1970年1月1日 00:00:00以来的秒和纳秒
在这里插入图片描述

案例如下:

import java.time.Instant;

public class Demo {

    public static void main(String[] args) throws InterruptedException {
        // 获取从1970年一月一日 00:00:00 到现在的 纳秒
        System.out.println(Instant.now().getNano());
    }
}

结果展示
在这里插入图片描述

3.5 计算日期时间差

3.5.1 Period:用来计算两个日期差(LocalDate)

案例代码


import java.time.LocalDate;
import java.time.Period;

public class Demo {

    public static void main(String[] args) throws InterruptedException {
        // 计算日期差
        LocalDate nowDate = LocalDate.now();
        LocalDate date = LocalDate.of(2020, 2, 5);
        Period period = Period.between(date, nowDate);
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
    }
}

结果展示:
在这里插入图片描述

3.5.2 Duration:用来计算两个时间差(LocalTime)

案例代码如下:

import java.time.Duration;
import java.time.LocalTime;

public class Demo {

    public static void main(String[] args) throws InterruptedException {
        // 计算时间差
        LocalTime now = LocalTime.now();
        LocalTime time = LocalTime.of(18, 2, 14);
        // 通过Duration来计算时间差
        Duration duration = Duration.between(now, time);
        System.out.println(duration.toDays());
        System.out.println(duration.toHours());
        System.out.println(duration.toMinutes());
        System.out.println(duration.toMillis());
    }
}

结果展示:
在这里插入图片描述

3.6 时间校正器(时钟)

有时候我们想要时间校正器设置为这个月第几周的第几天,获取其它的日期,我们可以设置时间和日期。这时我们通过时间校正器效果会更好。

3.6.1 TemporalAdjuster:自定义时间校正器

案例代码

import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjuster;

public class Demo {

    public static void main(String[] args) throws InterruptedException {
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);
        // 将当前的日期调整到4个月后的第5天
        TemporalAdjuster adJuster = (temporal)->{
            LocalDateTime dateTime = (LocalDateTime) temporal;
            LocalDateTime nextTime = dateTime.plusMonths(4).withDayOfMonth(5);
            return nextTime;
        };
        LocalDateTime nextTime = now.with(adJuster);
        System.out.println(nextTime);
    }
}

结果展示:
在这里插入图片描述

3.6.2 TemporalAdjusters:通过该类静态方法提供了大量的常用TemporalAdjuster的实现。

TemporalAdjusters提供了许多的方法
在这里插入图片描述

import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;

public class Demo {

    public static void main(String[] args){
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime nextMonth = now.with(TemporalAdjusters.firstDayOfYear());
        System.out.println("设置为该年的第一天 " + nextMonth);
    }
}

结果展示
在这里插入图片描述

3.7 日期时间的时区

3.7.1 基本知识

Java8 中加入了对时区的支持,LocalDate、LocalTime、LocalDateTime是不带时区的,带时区的日期时间类分别为:ZonedDate、ZonedTime、ZonedDateTime。
其中每个时区都对应着 ID,ID的格式为 “区域/城市” 。例如 :Asia/Shanghai 等。
ZoneId:该类中包含了所有的时区信息

3.7.2 获取所有时区的id

案例代码

public class Demo {

    public static void main(String[] args){
        // 获取所有的时区id
        ZoneId.getAvailableZoneIds().forEach(System.out::println);
        
    }
}

结果展示:
在这里插入图片描述

3.7.3 获取指定时区

案例代码

import java.time.Clock;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Demo {

    public static void main(String[] args){

        // 获取标准时间
        ZonedDateTime now1 = ZonedDateTime.now(Clock.systemUTC());
        System.out.println("now1 = " + now1);
        // 获取中国使用的东八区的时区,比标准时间早8个小时
        LocalDateTime now2 = LocalDateTime.now();
        System.out.println("now2 = " + now2);
        // 使用计算机默认的时区,创建日期时间
        ZonedDateTime now3 = ZonedDateTime.now();
        System.out.println("now3 = " + now3);
        // 使用指定的时区创建日期时间
        ZonedDateTime now4 = ZonedDateTime.now(ZoneId.of("Australia/Tasmania"));
        System.out.println("now4 = " + now4);
    }
}

结果展示
在这里插入图片描述

四.JDK8新特性之日期时间API优势:

  1. 新版日期时间API中,日期和时间对象是不可变,操作日期不会影响原来的值,而是生成一个新的实例。
  2. 提供不同的两种方式,有效的区分了人和机器的操作。
  3. TemporalAdjuster可以更精确的操作日期,还可以自定义日期调整期。
  4. 解决了之前日期时间线程不安全的问题。在进行日期时间修改的时候,原来的LocalDate对象是不会被修改,每次操作都是返回了一个新的LocalDate对象,所以在多线程场景下是数据安全的。

五.勉励

又是劳累的一天啊,坚持,坚持,坚持!
一定要听父母的话,多锻炼,多锻炼,好了,不多了,出去跑会儿步,加油。
我是硕风和炜,我们下篇文章见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VC++随鼠标移动显示坐标和坐标映射模式学习

VC6,新建一个单文档工程; 把这两个加到视类头文件; CPoint m_ptOut; //用来保存鼠标坐标 CString strPosition; //用来保存输出的内容 视类CPP的构造函数中初始化, m_ptOut.x 0; m_ptOut.y 0; 用类向导为视类…

Boosting Crowd Counting via Multifaceted Attention之人群密度估计实践

这周闲来无事,看到一篇前不久刚发表的文章,是做密集人群密度估计的,这块我之前虽然也做过,但是主要是基于检测的方式实现的,这里提出来的方法还是比较有意思的,就拿来实践一下。论文在这里,感兴…

chatGPT模型原理

文章目录简介BertGPT 初代GPT-2GPT-3chatGPT开源ChatGPT简介 openai 的 GPT 大模型的发展历程。 Bert 2018年,自然语言处理 NLP 领域也步入了 LLM 时代,谷歌出品的 Bert 模型横空出世,碾压了以往的所有模型,直接在各种NLP的建模…

Java中的反射使用

1、获取Class对象的三种方式 1、对象调用Object类的getClass()方法(对象.getClass()) 2、调用类的class属性(类名.class) 3、调用Class类的静态方法(Class.forName(“包名.类名”))常用 Student类 package…

Xcode Developer Document 开发者文档

总目录 iOS开发笔记目录 从一无所知到入门 文章目录IntroDeveloper Documentation 打开方式菜单栏点击 | 快捷键方式另一种打开方式Intro 2016年我在学校学Java的时候,要查某个Java类/方法的用法还得自己手动下载一种.chm格式的开发文档文件&#xff0c…

python爬虫常见错误

python爬虫常见错误前言python常见错误1. AttributeError: WebDriver object has no attribute find_element_by_id1. 问题描述2. 解决办法2. selenium:DeprecationWarning: executable_path has been deprecated, please pass in1. 问题描述2. 解决办法3. 下载了包…

4、算法MATLAB---认识矩阵

认识矩阵1、矩阵定义和基本运算1.1 赋值运算符:1.2 等号运算符:1.3 空矩阵1.4 一行一列矩阵1.5 行矩阵(元素用空格或逗号分隔)1.6 列矩阵(分号表示换行)1.7 m行n列的矩阵:行值用逗号间隔&#x…

SPI总线设备驱动模型

SPI总线设备驱动模型 文章目录SPI总线设备驱动模型参考资料:一、平台总线设备驱动模型二、 数据结构2.1 SPI控制器数据结构2.2 SPI设备数据结构2.3 SPI设备驱动三、 SPI驱动框架3.1 SPI控制器驱动程序3.2 SPI设备驱动程序致谢参考资料: 内核头文件&…

角角的Qt自学日记:Qt的安装

目录 2. 打开下载器,输入账号和密码,然后单击下一步: 3. 分别单击2个单选框,其它不用管,直接单击下一步: 4. 先设置一下安装目录,因为现在Qt基本都好几个g,建议找个内存够的盘。然…

尝试用程序计算Π(3.141592653......)

文章目录1. π\piπ2. 用微积分来计算π\piπ2.1 原理2.2 代码2.3 结果2.4 分析1. π\piπ π\piπ的重要性或者地位不用多说,有时候还是很好奇,精确地π\piπ值是怎么计算出来的。研究π\piπ的精确计算应该是很多数学家计算机科学家努力的方向&#xf…

【老卫搬砖】034期:HarmonyOS 3.1 Beta 1初体验,我在本地模拟器里面刷短视频

今天啊打开这个DevEco Studio的话,已经提示有3.1Beta1版本的一个更新啊。然后看一下它的一些特性。本文也演示了如何在本地模拟器里面运行HarmonyOS版短视频。 主要特性 新特性包括: Added support for Windows 11 64-bit and macOS 13.x OSs, as well…

vue中render函数的作用和参数(vue2中render函数用法)

render 函数是 Vue2.x 新增的一个函数、主要用来提升节点的性能,它是基于 JavaScript 计算。使用 Render 函数将 Template 里面的节点解析成虚拟的 Dom 。Vue 推荐在绝大多数情况下使用模板来创建 HTML。然而在一些场景中,需要 JavaScript 的完全编程能力…

RK3568平台开发系列讲解(驱动基础篇)GIC v3中断控制器

🚀返回专栏总目录 文章目录 一、什么是GIC二、GIC v3中断类型三、GIC v3基本结构3.1、Distributor3.2、CPU interface简介3.3、Redistributor简介3.4、ITS(Interrupt translation service)4、中断状态和处理流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢ARM多核…

在线文档技术-编辑器篇

这是在线文档技术的第二篇文章,本文将对目前市面上所有的主流编辑器和在线文档进行一次深入的剖析和研究,从而使大家对在线文档技术有更深入的了解,也让更多人能够参与其开发与设计中来。 注意:出于对主流文档产品的尊重&#xf…

【Linux环境配置】7. Linux部署code-server

安装 code-server 两种方法,一种是在线安装,另一种是本地安装。因为主机访问github可能会报443错误,因此这里我推荐使用本地安装方法! 本地安装方法 进入github,搜索code-server找到项目地址:https://gi…

链表(一):移除链表元素、设计链表等力扣经典链表题目

203.移除链表元素相关题目链接:力扣 - 移除链表元素题目重现给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。思路链表的删除操作如上图所示,我们需要先找到要删除的…

不需要高深技术,只需要Python:创建一个可定制的HTTP服务器!

目录 1、编写服务端代码,命名为httpserver.py文件。 2、编写网页htmlcss文件,命名为index.html和style.css文件。 3、复制htmlcss到服务端py文件同一文件夹下。 4、运行服务端程序。 5、浏览器中输入localhost:8080显示如下: 要编写一个简单的能发布…

UML类图中的类图、接口图、关联、聚合、依赖、组合概念的解释

文章目录UML类图依赖和关联的主要区别UML类图 类&#xff1a;类有三层结构 第一层&#xff1a;类的名字第二层&#xff1a;类的属性第三层&#xff1a;类的方法 接口&#xff1a;接口跟类相似&#xff0c;不过多了一个<<interface>>来表示它是一个接口 第一层&a…

华为OD机试用Python实现 -【统一限载货物数最小值】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲统一限载货物数最小值题目描述输入描述输出描述说明示例一输入输出说明示例二输入输出说明Python 代码实现算法逻辑华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查…

社畜大学生的Python之pandas学习笔记,保姆入门级教学

接上期&#xff0c;上篇介绍了 NumPy&#xff0c;本篇介绍 pandas。 目录 pandas 入门pandas 的数据结构介绍基本功能汇总和计算描述统计处理缺失数据层次化索引 pandas 入门 Pandas 是基于 Numpy 构建的&#xff0c;让以 NumPy 为中心的应用变的更加简单。 Pandas是基于Numpy…