Java8新特性之时间API

2023-11-10

本篇主要介绍Java 8中新引入的全新的一套时间API。

Java 8之前的Date类的缺陷

  • java.util包和java.sql包中都有一个Date类,区别是util包中的Date类存储的是年月日时分秒;而sql包中的Date只存储年月日。这本身就是一个不好的设计。
  • Java8以前的一系列日期时间类数量较多且功能有重复,设计冗余。
  • java.util.Date类有多个问题:首先它是可变类,意味着有线程安全问题;其次它没有提供国际化,没有时区支持;Date的格式化自己不能完成,需要依赖SimpleDateFormat类。

由于以上问题的存在,Java 8提供了一套全新的时间API,这些API都在java.time包中,本篇文章中我们仅介绍常用的几个类的API。

新日期API

LocalDate

LocalDate是不可变的日期对象,不包含具体时间和时区信息。以下是该类的常用方法,第一个方法创建了LocalDate对象,以后的方法都是用的该对象。

  • public static LocalDate now():根据当前日期创建LocalDate对象
LocalDate date = LocalDate.now();
System.out.println("今天的日期是"+date.toString());
//返回结果
今天的日期是2020-09-18
  • public int getDayOfMonth():返回月份中的第几天。
System.out.println("今天是这个月的第"+date.getDayOfMonth()+"天");
//返回结果
今天是这个月的第18天
  • public int getDayOfYear():返回今天是这一年的第多少天。
System.out.println("今天是今年的第"+date.getDayOfYear()+"天");
//返回结果
今天是今年的第262天
  • public Month getMonth():返回当前月份的英文大写表示。
System.out.println("这个月是"+date.getMonth());
//返回结果
这个月是SEPTEMBER
  • public int getMonthValue():返回当前月份是该年的第多少个月。
System.out.println("这个月是今年的第"+date.getMonthValue()+"个月");
//返回结果
这个月是今年的第9个月
  • public int getDayOfWeek():返回周几的英文大写表示。
System.out.println("今天是"+date.getDayOfWeek());
//返回结果
今天是FRIDAY
  • public int getYear():返回年份。
System.out.println("今年是第"+date.getYear()+"年");
//返回结果
今年是第2020年
  • public boolean isAfter(ChronoLocalDate other):检查当前日期是否晚于给定日期。
System.out.println("当前日期是否晚于给定日期:"+date.isAfter(LocalDate.of(2020,9,19)));
//返回结果
当前日期是否晚于给定日期:false
  • public boolean isBefore(ChronoLocalDate other):检查当前日期是否早于给定日期。
System.out.println("当前日期是否早于给定日期:"+date.isBefore(LocalDate.of(2020,9,19)));
//返回结果
当前日期是否早于给定日期:true
  • public boolean isEqual(ChronoLocalDate other):检查当前日期是否与给定日期相同。
System.out.println("当前日期是否早于给定日期:"+date.isEqual(LocalDate.of(2020,9,19)));
//返回结果
当前日期是否早于给定日期:false
  • public boolean isLeapYear(long prolepticYear):检查当前年份是否是闰年。
System.out.println("当前年份是否是闰年:"+date.isLeapYear());
//返回结果
当前年份是否是闰年:true
  • public int lengthOfMonth():返回当前月份的天数。
System.out.println("当前月份有"+date.lengthOfMonth()+"天");
//返回结果
当前月份有30天
  • public int lengthOfYear():返回当前年份的天数。
System.out.println("当前年份有"+date.lengthOfYear()+"天");
//返回结果
当前年份有366天
  • public String format(DateTimeFormatter formatter):按照给定的格式进行格式化并返回格式化后的日期字符串,入参为DateTimeFormatter的属性。
System.out.println(date.format(DateTimeFormatter.BASIC_ISO_DATE));
//返回结果
20200918
  • public LocalDate minus(long amountToSubtract, TemporalUnit unit):将当前日期减去给定单位的相应数量的时间并返回副本,第一个参数为单位数量,第二个参数为单位(ChronoUnit类的属性,此处不能为时分秒)。
System.out.println("当前日期的十天前的日期为:"+date.minus(10, ChronoUnit.DAYS));
//返回结果
当前日期的十天前的日期为:2020-09-08
  • public LocalDate minusDays(long daysToSubtract):将当前日期减去指定的天数并返回副本。
System.out.println("当前日期的十天前的日期为:"+date.minusDays(10));
//返回结果
当前日期的十天前的日期为:2020-09-08
  • public static LocalDate now(ZoneId zone):从指定时区的系统始终获取当前日期。
LocalDate zoneDate = LocalDate.now(ZoneId.of("America/Anchorage"));
System.out.println("从指定时区的系统始终获取当前日期:"+zoneDate.toString());
//返回结果
从指定时区的系统始终获取当前日期:2020-09-18
  • public static LocalDate of(int year, Month month, int dayOfMonth):根据给定的年月日创建LocalDate对象。
LocalDate ofDate = LocalDate.of(2020,4,12);
System.out.println(ofDate.toString());
//输出结果
2020-04-12
  • public static LocalDate ofYearDay(int year, int dayOfYear):根据给定的年和天数创建LocalDate对象。
LocalDate ofYearDate = LocalDate.ofYearDay(2020,263);
System.out.println(ofYearDate.toString());
//输出结果
2020-09-19
  • public static LocalDate parse(CharSequence text):根据字符串创建LocalDate对象。
LocalDate parseDate = LocalDate.parse("2020-03-12");
System.out.println(parseDate.toString());
//输出结果
2020-03-12
  • public LocalDate plus(long amountToAdd, TemporalUnit unit):将当前日期加上给定单位的相应数量的时间并返回副本,第一个参数为单位数量,第二个参数为单位(ChronoUnit类的属性,此处不能为时分秒)。
System.out.println("当前日期过十天后的日期为:"+date.plus(10,ChronoUnit.DAYS));
//输出结果
当前日期过十天后的日期为:2020-09-29
  • public int get(TemporalField field):根据传参获取日期对应的值,传参是ChronoField的属性。
System.out.println("当前日期的年份为:"+date.get(ChronoField.YEAR));
System.out.println("当前日期为这个月的第"+date.get(ChronoField.DAY_OF_MONTH)+"天");
System.out.println("当前日期是这周的第"+date.get(ChronoField.DAY_OF_WEEK)+"天");
//输出结果
当前日期的年份为:2020
当前日期为这个月的第19天
当前日期是这周的6
  • public LocalDate with(TemporalField field, long newValue):根据参数修改对应的值并返回副本,参数为ChronoField的属性,此处只能为DAYS,MONTHS,YEARS。
LocalDate anoDate = date.with(ChronoField.YEAR,2000);
System.out.println(anoDate.toString());
//输出结果
2000-09-19

LocalDateTime

LocalDateTime是不可变的日期时间对象,包含日期和时间,但不包含时区信息。LocalDateTime许多方法与LocalDate名称相同且用法相同,此处不再赘述,仅介绍独有方法。

  • public int getHour():获得时间中的小时数。类似方法还有getMonth(),getMinute()等。
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("当前时间为:"+dateTime.format(DateTimeFormatter.ISO_DATE_TIME));
System.out.println("当前小时为:"+dateTime.getHour());
//输出结果
当前时间为:2020-09-19T20:29:29.465
当前小时为:20
  • public int get(TemporalField field):根据参数获取日期时间中的值,参数为ChronoField的属性。
System.out.println("当前分钟数为"+dateTime.get(ChronoField.MINUTE_OF_HOUR));
//输出结果
当前分钟数为35
  • public LocalDate toLocalDate():获取此LocalDateTime的日期部分并创建LocalDate对象返回。
System.out.println("当前日期时间的日期部分为:"+dateTime.toLocalDate().toString());
//输出结果
当前日期时间的日期部分为:2020-09-19
  • public LocalTime toLocalTime():获取此LocalDateTime的时间部分并创建LocalTime对象返回。
System.out.println("当前日期时间的时间部分为:"+dateTime.toLocalTime().toString());
//输出结果
当前日期时间的时间部分为:20:40:19.735

LocalTime

LocalTime是不可变的时间对象,不包含日期和时区信息。LocalTime的许多方法与LocalDate名称相同且用法相同,此处不再赘述,仅介绍其独有方法。

  • public LocalDateTime atDate(LocalDate date):此LocalTime对象与给定的LocalDate对象组合返回一个LocalDateTime对象。
LocalTime time = LocalTime.now();
System.out.println("当前时间为:"+time.toString());
LocalDateTime ldt = time.atDate(LocalDate.now());
System.out.println("当前日期时间为:"+ldt.toString());
//输出结果
当前时间为:20:47:12.399
当前日期时间为:2020-09-19T20:47:12.399

Duration

Duration是不可变的时间差对象,它仅可以计算LocalTime或LocalDateTime对象的时间差。其使用方法如下:

LocalTime time1 = LocalTime.now();
LocalTime time2 = LocalTime.of(21,10,00);
Duration durationTime = Duration.between(time1,time2);
System.out.println("两个LocalTime对象的时间差为:"+durationTime.toString());

LocalDateTime ldt1 = LocalDateTime.now();
LocalDateTime ldt2 = LocalDateTime.of(2020,9,19,21,10);
Duration durationDT = Duration.between(ldt1,ldt2);
System.out.println("两个LocalDateTime对象的时间差为:"+durationDT.toString());
//输出结果
两个LocalTime对象的时间差为:PT1M21.283S
两个LocalDateTime对象的时间差为:PT1M21.223S

Duration类同样有许多方法与LocalDate类用法相同,这里我们仅介绍其独有方法。

  • public Duration abs():返回此Duration对象的正值的副本。
System.out.println(durationDT.abs());
//输出结果
PT26H38M2.033S
  • public static Duration between(Temporal startInclusive, Temporal endExclusive):计算两个时间的时间间隔并创建Duration对象返回。此方法上面演示过,不贴测试代码了。
  • public boolean isNegative()/public boolean isZero():判断此时间间隔是否是负数或零。
System.out.println("此时间间隔是否是负数:"+durationDT.isNegative());
System.out.println("此时间间隔是否为0:"+durationDT.isZero());
//输出结果
此时间间隔是否是负数:false
此时间间隔是否为0:false

Period

Period是不可变的日期差对象,它仅可以计算LocalDate对象的日期差。它的使用方法如下:

LocalDate date1 = LocalDate.now();
LocalDate date2 = LocalDate.of(2020,11,1);
Period period = Period.between(date1,date2);
System.out.println("两个LocalDate对象的日期差为:"+period.toString());
//输出结果
两个LocalDate对象的日期差为:P1M13D

ZonedDateTime

ZonedDateTime是不可变的存储了时区信息的日期时间对象。该对象同样与LocalDate拥有许多类似的方法,仅介绍其独有方法。

  • public ZoneId getZone():获取时区id。
ZonedDateTime zdt = ZonedDateTime.now();
System.out.println(zdt.toString());
System.out.println("时区id为:"+zdt.getZone());
//输出结果
2020-09-19T21:40:45.505+08:00[GMT+08:00]
时区id为:GMT+08:00
  • public ZoneOffset getOffset():获取区域偏移量。
System.out.println(zdt.getOffset());
//输出结果
+08:00

ZoneId

ZoneId表示一个时区id。其常用方法如下:

public static ZoneId systemDefault():获取系统默认时区id。

ZoneId zoneId = ZoneId.systemDefault();
System.out.println("系统默认时区id为:"+zoneId.toString());
//输出结果
系统默认时区id为:GMT+08:00

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java8新特性之时间API 的相关文章

随机推荐

  • C# 如何将EMF文件转换成PNG文件

    本文主要讲述如何将EMF文件转换成PNG文件 目录 一 EMF文件和PNG文件 二 代码 一 EMF文件和PNG文件 EMF文件和PNG文件都是Windows系统可以读取的图片文件格式 所以转换比较简单 二 代码 有几个地方需要要注意 1
  • Softing D-PDU API 11_30_010 新版本支持TLS

    一 TLS的概述 安全传输层协议 Transport Layer Security 缩写 TLS 前身为安全套接层 Secure Sockets Layer 缩写 SSL 用于在通信应用程序之间提供保密性和数据完整性 该协议由两层组成 一个
  • 质因数分解(唯一分解定理)

    质因数分解 题目描述 多数据 给出t个数 求出它的质因子个数 数据没坑 难度降低 输入描述 Input Description 第一行 t 之后t行 数据 输出描述 t行 分解后结果 质因子个数 样例输入 2 11 6 样例输出 1 2 数
  • vs2010 点击时应用程序无法正常启动(0xc000007b).请单击“确定”关闭应用程序解决办法

    昨天做项目的时候 在安装一个win32的应用程序后再次启动vs2010时发现报错 就是如下的错误 哎呀 我的天 关键时刻就打不开了 这么怎么办呢 赶紧去搜解决办法 1 使用Directx修复 修复了180个左右的dll文件 但是没有解决我的
  • 卷积操作中的卷积核形状到底是怎样的

    input shape 2 5 5 kernal size 2 3 3 kernal amount 3 卷积核的维度与输入的维度一致 都是三维的 最后的输出的通道数与卷积核数量一致 用了三个卷积核 就会输出三个通道
  • IDEA最好用的插件推荐,吐血整理!

    作者 明明如月 来源 慕课专栏 阿里巴巴Java开发手册 1 前言 俗话说 工欲善其事 必先利其器 为了助力大家的学习和进阶 本小节介绍几个对 Java 学习非常有帮助的 IDEA 插件 代码反编译和反汇编工具 以及非常不错的网站等 2 I
  • 【板子】

    线段树 1 include
  • c语言数组处理实验报告心得体会,C语言实验报告总结计划数组.doc

    学 生 实 验 报 告 学院 软件与通信工程学院 课程名称 C 语言与程序设计 专业班级 通信 121 姓名 学号 学生实验报告 4 学生姓名 学号 同组人 实验项目 函数 必修 选修 演示性实验 验证性实验 操作性实验 综合性实验 实验地
  • 海量数据存储方案

    参考原文 http blog csdn net xlgen157387 article details 53230138 一 网站应用背景 开发一个网站的应用程序 当用户规模比较小的时候 使用简单的 一台应用服务器 一台数据库服务器 一台文
  • 使用ffmpeg将图片将图片合成视频或者取视频帧作为视频封面

    首先需要下载ffmpeg exe将exe文件放入资金的程序bin目录 然后通过命令行的方式调用ffmpeg是完成想要做的事情 这里举两个最简单的例子 将图片合成视频或者取视频帧作为视频封面 string pathString AppDoma
  • overleaf怎么输入中文_OverLeaf v2 的入门及中文编辑

    Overleaf 以前的WriteLaTex 是一种可在线使用的LaTex文档的书写平台 用户可以不用花费大量的时间和精力在自己的机器上搭建Tex环境 他们可以方便地在线编辑和书写LaTex文档 2017年6月 类似的平台 ShareLaT
  • TB-RK3399pro成砖后Typec无法连接电脑的方法

    TB RK3399pro 即为toybrick的3399pro板 成砖原因 强行刷友善之臂的3399固件 且失败 解决方法 1 断开所有连接 2 用Typec连接电脑 3 按下板子正面的 maskrom 按键 在散热片固定钉旁的一个小按键
  • USB数据接口类型

    为了方便下载数码相机记忆体中的文件 数码相机和PC的连接有多种方式 常见的就是USB接口和IEEE1394火线接口 USB与IEEE1394比较 两者的传输速率不同 过去 很多人都会选用IEEE1394作传输文件用 因为其流量比USB1 1
  • 开环与闭环传递函数波特图的意义

    注 本文默认读者都是控制类专业 先复习一下奈氏曲线和奈氏判据 以及波特图 下面进入今天的主题 开环与闭环传递函数波特图的意义 分为如下三个部分 开环波特图的意义 闭环波特图的意义 为什么大多研究开环波特图 开环与闭环传递函数 一个典型的控制
  • stm32学习—库函数总结

    库函数总结这一章 描述了一般stm32开发的流程 一些常用库函数的设置 一般一开始是使用结构体进行数据的初始化 然后通过使用的途径进行划分 比如常用的数据的输出和输出 这在大部分的外设中都是大量涉及的 再接是辅助我们进行逻辑代码的设计的状态
  • 如何在Java项目中定义并调用自己编写的native方法?

    如何在Java项目中定义并调用C C 编写的native方法 开发工具 编写测试的java代码 编写C 代码 将dll文件链接到java项目中 总结 开发工具 IntelliJ IDEA 2020 用来编写java代码 Visual Stu
  • 关于Markdown表格中如何进行换行、合并单元格

    关于Markdown表格中如何进行换行 合并单元格 1 表格中内容对齐 换行 设置对齐方式 表格内容换行 2 表格中单元格的合并 合并表格行 合并表格列 综合使用 1 表格中内容对齐 换行 常规表格使用 一般我们都会这样用表格如下 姓名 年
  • Kruskal算法求解最小生成树

    最小生成树是一个连通图 什么是连通图 强 连通图详解前面介绍了 图存储结构 本节继续讲解什么是 连通图 前面讲过 图中从一个顶点到达另一顶点 若存在至少一条路径 则称这两个顶点是连通着的 例如图 1 中 虽然 V1 和 V3http c b
  • 空间相关分析(三) 局部莫兰指数的理解与计算

    在上篇中 我们详细地阐述了全局莫兰指数 Global Moran I 的含义以及具体的软件实操方法 今天 就来进一步地说明局部莫兰指数 Local Moran I 的含义与计算 首先说明一下进行局部相关分析的必要性 在全局相关分析中 如果全
  • Java8新特性之时间API

    本篇主要介绍Java 8中新引入的全新的一套时间API Java 8之前的Date类的缺陷 java util包和java sql包中都有一个Date类 区别是util包中的Date类存储的是年月日时分秒 而sql包中的Date只存储年月日