文章目录

  • 前言
  • Date Time API
    • 1.Java 8以前日期时间API存在的问题
    • 2.LocalDate/LocalTime/LocalDateTime
    • 3.获取对象的方法
    • 4.获取相关的方法
    • 5.转换的方法
    • 6.判断的方法
    • 7.增减年月日时分秒的方法
    • 8.指定年月日的方法
    • 9.日期格式化为字符串
    • 10.解析字符串为日期时间的方法
    • 11.两个日期之间的间隔

前言

Java 8之前的库对日期和时间的支持并不理想,为了解决这个问题,Java 8引入了一套全新的时间日期API,位于java.time路径下!

Date Time API

1.Java 8以前日期时间API存在的问题

Java 8以前, java.util.Datejava.util.Calendarjava.util.GregoiranCalendarjava.text.SimpleDateFormat 这四大类非常熟悉,它们分别用于处理日期、日历、公历、日期时间格式化。四大类存在的问题:

  1. 非线程安全:这四大类都不是线程安全的。开发者在使用这些类时必须自己处理多线程并发问题。
  2. 设计不佳 :一方面日期和日期格式化分布在多个包中;另一方面,java.util.Date 的默认日期为 1970年1月1日,没有统一性。而且 Date 类也缺少直接操作日期的相关方法。
  3. 时区处理困难:因为设计不佳,开发人员不得不编写大量代码来处理时区问题。
  4. 还有其它一些问题,如Calendar类月份从零开始计算等。

为了解决这些存在的问题,Java 8 在 java.time 包下包含一个全新的日期和时间API。有以下的改进:

  1. 新的日期时间 API 是线程安全的。不仅没有 setter 方法,而且任何对实例的变更都会返回一个新的实例,保证原来的实例不变。
  2. 新的日期时间 API 提供了大量的方法,用于修改日期时间的各个部分,并返回一个新的实例。
  3. 借鉴了第三方日期时间库joda很多的优点。
  4. 在时区方面,新的日期时间 API 引入了 域 ( domain ) 这个概念。

2.LocalDate/LocalTime/LocalDateTime

  • java.time.LocalDate 用于表示 “本地日期”,无 “时间”。LocalDate 不承载时区信息。
  • java.time.LocalTime 用于表示 “本地时间”,无 “日期”。LocalTime 不承载时区信息。
  • java.time.LocalDateTime 用于表示 “本地日期与时间”。LocalDateTime 不承载时区信息。

LocalDate 实例与 LocalTime 实例能够共同构建 LocalDateTime 实例,由 LocalDateTime 实例能够获取 LocalDate 实例与 LocalTime 实例。

3.获取对象的方法

静态方法:

  • now():(获取的时间是系统当前的时间
  • of()(方法参数可以指定时间

代码如下(示例):

/*** @Description 获取对象的方法 now()、of()* @Author mizhu* @Date 2021/8/6 23:22* @Version 1.0*/
public class Test1 {public static void main(String[] args) {/* 通过静态方法 now() 返回该类的实例 *///获取当前的日期时分秒LocalDateTime now = LocalDateTime.now();System.out.println(now);//获取当前的日期LocalDate now1 = LocalDate.now();System.out.println(now1);//获取当前的时分秒LocalTime now2 = LocalTime.now();System.out.println(now2);System.out.println("=========================================");/* 静态方法 of() 返回该类的实例 *///指定日期时分秒LocalDateTime localDateTime = LocalDateTime.of(2021, 8, 6, 23, 22, 30);System.out.println(localDateTime);//指定日期LocalDate date = LocalDate.of(2021, 8, 6);System.out.println(date);//指定时分秒LocalTime time = LocalTime.of(23, 23, 30);System.out.println(time);}
}

输出结果:

2021-08-06T23:44:02.849
2021-08-06
23:44:02.850
=========================================
2021-08-06T23:22:30
2021-08-06
23:23:30

4.获取相关的方法

  • getYear():获取年
  • getHour():获取小时
  • getMinute():获取分钟
  • getSecond():获取秒值
  • getDayOfMonth():获得月份天数(1-31)
  • getDayOfYear():获得年份天数(1-366)
  • getDayOfWeek():获得星期几(返回一个 DayOfWeek枚举值)
  • getMonth():获得月份(返回一个 Month 枚举值)
  • getMonthValue():获得月份(1-12)
  • getYear():获得年份

代码如下(示例):

/*** @Description 获取相关的方法* @Author mizhu* @Date 2021/8/6 23:44* @Version 1.0*/
public class Test2 {public static void main(String[] args) {//获取日期时分秒LocalDateTime now = LocalDateTime.now();//获取年份int year = now.getYear();System.out.println(year);//获取月份枚举//Month 枚举类,定义了十二个月份Month month = now.getMonth();System.out.println(month);//获取月份的数值int monthValue = now.getMonthValue();System.out.println(monthValue);//获得年份天数int dayOfYear = now.getDayOfYear();System.out.println(dayOfYear);//获取当天在本月的第几天int dayOfMonth = now.getDayOfMonth();System.out.println(dayOfMonth);//获取当天在本月的星期几DayOfWeek dayOfWeek = now.getDayOfWeek();System.out.println(dayOfWeek);//获取小时int hour = now.getHour();System.out.println(hour);//获取分钟int minute = now.getMinute();System.out.println(minute);//获取秒值int second = now.getSecond();System.out.println(second);}
}

输出结果:

2021
AUGUST
8
218
6
FRIDAY
23
48
3

5.转换的方法

  • toLocalDate():将LocalDateTime转换为相应的LocalDate对象
  • toLocalTime():将LocalDateTime转换为相应的LocalTime对象

代码如下(示例):

/*** @Description 转换的方法* @Author mizhu* @Date 2021/8/6 23:48* @Version 1.0*/
public class Test3 {public static void main(String[] args) {//获取当前年月日,时分秒LocalDateTime now = LocalDateTime.now();System.out.println(now);//将LocalDateTime转换为相应的LocalDate对象LocalDate localDate = now.toLocalDate();System.out.println(localDate);//将LocalDateTime转换为相应的LocalTime对象LocalTime localTime = now.toLocalTime();System.out.println(localTime);}
}

输出结果:

2021-08-06T23:49:06.299
2021-08-06
23:49:06.299

6.判断的方法

  • isAfter():判断一个日期是否在指定日期之后
  • isBefore():判断一个日期是否在指定日期之前
  • isEqual():判断两个日期是否相同
  • isLeapYear():判断是否是闰年(注意是LocalDate类 和 LocalDateTime类特有的方法)

代码如下(示例):

/*** @Description 判断的方法* @Author mizhu* @Date 2021/8/6 23:49* @Version 1.0*/
public class Test4 {public static void main(String[] args) {//获取当前的日期LocalDate now = LocalDate.now();System.out.println("当前日期:" + now);//指定的日期LocalDate of = LocalDate.of(2021, 8, 6);//判断一个日期是否在另一个日期之前boolean before = of.isBefore(now);System.out.println("指定日期是否在" + now + "之前:" + before);//判断一个日期是否在另一个日期之后boolean after = of.isAfter(now);System.out.println("指定日期是否在" + now + "之后:" + after);//判断这两个日期是否相等boolean equals = now.equals(of);System.out.println("两个日期是否相等:" + equals);//判断闰年boolean leapYear = of.isLeapYear();System.out.println("指定日期是否是闰年:" + leapYear);}
}

输出结果:

当前日期:2021-08-07
指定日期是否在2021-08-07之前:true
指定日期是否在2021-08-07之后:false
两个日期是否相等:false
指定日期是否是闰年:false

7.增减年月日时分秒的方法

plus相关的方法:

  • plusYears(long years):增加指定年份
  • plusMonths(long months):增加指定月份
  • plusWeeks(long weeks):增加指定周
  • plusDays(long days):增加指定日
  • plusHours(long hours):增加指定时
  • plusMinutes(long minutes):增加指定分
  • plusSeconds(long seconds):增加指定秒
  • plusNanos(long nanos):增加指定纳秒

minus相关的方法:

  • minusYears(long years):减少指定年
  • minusMonths(long months):减少指定月
  • minusWeeks(long weeks):减少指定周
  • minusDays(long days):减少指定日
  • minusHours(long hours):减少指定时
  • minusMinutes(long minutes):减少指定分
  • minusSeconds(long seconds):减少指定秒
  • minusNanos(long nanos):减少指定纳秒

代码如下(示例):

/*** @Description 增减年月日时分秒的方法(plus/minus系列的方法)* @Author mizhu* @Date 2021/8/7 10:02* @Version 1.0*/
public class Test5 {public static void main(String[] args) {LocalDateTime now = LocalDateTime.now();System.out.println("当前日期:" + now);System.out.println("==================plusXXX系列的方法====================");/*** 增加时间量的方法 plusXXX系列的方法 返回的是一个新的日期对象* plusYears(long years):增加指定年份* plusMonths(long months):增加指定月份* plusWeeks(long weeks):增加指定周* plusDays(long days):增加指定日* plusHours(long hours):增加指定时* plusMinutes(long minutes):增加指定分* plusSeconds(long seconds):增加指定秒* plusNanos(long nanos):增加指定纳秒*/LocalDateTime plusYears = now.plusYears(1);System.out.println(plusYears.getYear());LocalDateTime plusMonths = now.plusMonths(3);System.out.println(plusMonths.getMonthValue());LocalDateTime plusWeeks = now.plusWeeks(2);System.out.println(plusWeeks.getDayOfMonth());LocalDateTime plusDays = now.plusDays(10);System.out.println(plusDays.getDayOfMonth());LocalDateTime plusHours = now.plusHours(5);System.out.println(plusHours.getHour());LocalDateTime plusMinutes = now.plusMinutes(50);System.out.println(plusMinutes.getMinute());LocalDateTime plusSeconds = now.plusSeconds(100);System.out.println(plusSeconds.getSecond());LocalDateTime plusNanos = now.plusNanos(10);System.out.println(plusNanos.getNano());System.out.println("==================minusXXX系列的方法====================");/*** 减去时间量的方法 minusXXX系列的方法 返回的是一个新的日期对象* minusYears(long years):减少指定年* minusMonths(long months):减少指定月* minusWeeks(long weeks):减少指定周* minusDays(long days):减少指定日* minusHours(long hours):减少指定时* minusMinutes(long minutes):减少指定分* minusSeconds(long seconds):减少指定秒* minusNanos(long nanos):减少指定纳秒*/LocalDateTime minusYears = now.minusYears(5);System.out.println(minusYears.getYear());LocalDateTime minusMonths = now.minusMonths(2);System.out.println(minusMonths.getMonthValue());LocalDateTime minusWeeks = now.minusWeeks(2);System.out.println(minusWeeks.getDayOfMonth());LocalDateTime minusDays = now.minusDays(4);System.out.println(minusDays.getDayOfMonth());LocalDateTime minusHours = now.minusHours(2);System.out.println(minusHours.getHour());LocalDateTime minusMinutes = now.minusMinutes(10);System.out.println(minusMinutes.getMinute());LocalDateTime minusSeconds = now.minusSeconds(100);System.out.println(minusSeconds.getSecond());LocalDateTime minusNanos = now.minusNanos(10);System.out.println(minusNanos.getNano());}
}

输出结果:

当前日期:2021-08-07T10:27:46.139
==================plusXXX系列的方法====================
2022
11
21
17
15
17
26
139000010
==================minusXXX系列的方法====================
2016
6
24
3
8
17
6
138999990

8.指定年月日的方法

代码如下(示例):

/*** @Description 指定年月日的方法* @Author mizhu* @Date 2021/8/7 10:30* @Version 1.0*/
public class Test6 {public static void main(String[] args) {/*** with(TemporalAdjuster adjuster):指定特殊时间* withYear(int year):指定年份* withMonth(int month):指定当前年的某月* withDayOfYear(int dayOfYear):指定当前年的某日* withDayOfMonth(int dayOfMonth):指定当前月的某日*/LocalDate now = LocalDate.now();System.out.println("当前日期:" + now);//TemporalAdjusters工具类,提供了一些获取特殊日期的方法,示例如下:LocalDate firstDayOfMonth = now.with(TemporalAdjusters.firstDayOfMonth()); //指定这个月的第一天System.out.println(firstDayOfMonth);LocalDate lastDayOfMonth = now.with(TemporalAdjusters.lastDayOfMonth()); //指定这个月的最后一天System.out.println(lastDayOfMonth);LocalDate firstDayOfNextMonth = now.with(TemporalAdjusters.firstDayOfNextMonth()); //指定下个月的第一天System.out.println(firstDayOfNextMonth);LocalDate firstDayOfYear = now.with(TemporalAdjusters.firstDayOfYear()); //指定当年的第一天System.out.println(firstDayOfYear);LocalDate lastDayOfYear = now.with(TemporalAdjusters.lastDayOfYear()); //指定当年的最后一天System.out.println(lastDayOfYear);LocalDate dayOfWeekInMonth = now.with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.FRIDAY)); //指定这个月的第二个星期五是几号System.out.println(dayOfWeekInMonth);LocalDate localDate = now.withYear(2018);System.out.println(localDate);LocalDate withMonth = now.withMonth(12);System.out.println(withMonth);LocalDate withDayOfYear = now.withDayOfYear(88);System.out.println(withDayOfYear);LocalDate withDayOfMonth = now.withDayOfMonth(8);System.out.println(withDayOfMonth);}
}

输出结果:

当前日期:2021-08-07
2021-08-01
2021-08-31
2021-09-01
2021-01-01
2021-12-31
2021-08-13
2018-08-07
2021-12-07
2021-03-29
2021-08-08

9.日期格式化为字符串

代码如下(示例):

/*** @Description 日期格式化为字符串* @Author mizhu* @Date 2021/8/7 10:47* @Version 1.0*/
public class Test7 {public static void main(String[] args) {//获取当前日期时分秒LocalDateTime now = LocalDateTime.now();//默认格式 年-月-日T时:分:秒System.out.println(now);//指定格式DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//传入格式String dateStr = now.format(dtf);System.out.println(dateStr);}
}

输出结果:

2021-08-07T10:50:08.267
2021-08-07 10:50:08

10.解析字符串为日期时间的方法

代码如下(示例):

/*** @Description 解析字符串为日期时间的方法* @Author mizhu* @Date 2021/8/7 11:08* @Version 1.0*/
public class Test8 {public static void main(String[] args) {/*** paser(String str):将一个日期字符串解析成日期对象,注意字符串日期的写法的格式要正确,否则解析失败* paser(String str, DateTimeFormatter formatter):将字符串按照参数传入的格式进行解析*///日期时分秒 字符串String dateTimeStr = "2021-08-07T11:14:30";//把 日期时分秒 字符串解析成时分秒对象LocalDateTime parse = LocalDateTime.parse(dateTimeStr);System.out.println(parse);System.out.println("========================================");//日期 字符串String dateStr = "2021-08-07";//把日期字符串解析成日期对象 如果日期字符串时年月日 解析时用 LocalDateLocalDate parse1 = LocalDate.parse(dateStr);System.out.println(parse1);System.out.println("========================================");//时分秒 字符串String timeStr = "11:13:30";//把 时分秒 字符串解析成时分秒对象LocalTime parse2 = LocalTime.parse(timeStr);System.out.println(parse2);System.out.println("========================================");//自定义 日期 时分秒 格式字符串String selfDateTimeStr = "2021-08-07 11:15:14";//自定义解析格式DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//按照指定的格式去解析LocalDateTime parse3 = LocalDateTime.parse(selfDateTimeStr, dtf);System.out.println(parse3);}
}

输出结果:

2021-08-07T11:14:30
========================================
2021-08-07
========================================
11:13:30
========================================
2021-08-07T11:15:14

11.两个日期之间的间隔

代码如下(示例):

/*** @Description Period类* @Author mizhu* @Date 2021/8/7 11:32* @Version 1.0*/
public class Test9 {public static void main(String[] args) {LocalDate now = LocalDate.now();System.out.println(now);LocalDate of = LocalDate.of(2022, 10, 8);System.out.println(of);//计算两个日期的间隔Period between = Period.between(now, of);System.out.println(between.getYears());System.out.println(between.getMonths());System.out.println(between.getDays());}
}

输出结果:

2021-08-07
2022-10-08
1
2
1

Java8新特性——Date Time API相关推荐

  1. 【java8新特性】——Stream API详解(二)

    一.简介 java8新添加了一个特性:流Stream.Stream让开发者能够以一种声明的方式处理数据源(集合.数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation ...

  2. 【小家java】java8新特性之---全新的日期、时间API(JSR 310规范),附SpringMVC、Mybatis中使用JSR310的正确姿势

    [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小家java ...

  3. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

  4. 【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  5. 【java8新特性】——默认方法(五)

    一.简介 默认方法是指接口的默认方法,它是java8的新特性之一.顾名思义,默认方法就是接口提供一个默认实现,且不强制实现类去覆写的方法.默认方法用default关键字来修饰. 默认方法可以解决的痛点 ...

  6. 【java8新特性】——方法引用(四)

    一.简介 方法引用是java8的新特性之一, 可以直接引用已有Java类或对象的方法或构造器.方法引用与lambda表达式结合使用,可以进一步简化代码. 来看一段简单代码: public static ...

  7. 【java8新特性】——Optional详解(三)

    一.简介 Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null ...

  8. Java8新特性(一)—————Lambda表达式

    关注微信公众号[行走在代码行的寻路人]获取Java学习视频及资料. 简述Java8中的新特性: 1.速度快:两个对象比较,采用红黑树替换了链表,使其速度变快新增的速度比较与链表较慢 2.新增Lambd ...

  9. java8新特性_Java8新特性之Date API|乐字节

    大家好,我是乐字节的小乐,上篇文章讲述了<Java8新特性之Optional>,接下来,小乐将接着讲述Java8新特性之Date API 2019日历 Java8之Date API Jav ...

最新文章

  1. 计算机视觉算法与应用清华大学,计算机视觉-清华大学.ppt
  2. VCL界面控件DevExpress VCL Controls发布v18.2.5|附下载
  3. docker run命令详解
  4. 中国已消失的9所世界级大学
  5. 北京计算机一级2020,2020北京市一级计算机基础及MS Office应用考试在线自测试题库(不限设备,登陆即可做题)...
  6. java静态变量需要初始化吗_» Java静态变量初始化顺序浅谈
  7. 有史以来最伟大的软件开发书籍(国外篇)
  8. Sentinel 实战-控制台篇
  9. Webtrends网站运营分析解决方案简介
  10. EXCEL实现文本类型数字字符串递增
  11. 【jzoj 5336】Timi / 提米树(DP)
  12. 宽、窄带语谱图分析总结
  13. Java狐仙ol,狐仙八大职业介绍 简要分为四类
  14. 香港主机如何设置网站404页面
  15. 仿微信通讯录的Demo----PinnedHeaderListView
  16. 【数值计算】花式解线性方程组
  17. 【C++】结构体数组
  18. 集团审计BI项目的特点
  19. LM2596的肖特基二极管选择的注意点
  20. python 踩坑之解决django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.Did you insta

热门文章

  1. obs在windows下的完整编译安装教程
  2. Prim算法实现最小生成树
  3. [C++] LeetCode 174. 地下城游戏
  4. 关于8位指针强制转16位隐晦问题
  5. 《成为乔布斯》- 一个你不熟悉的乔帮主
  6. 华为云业务部总经理陶志强:科技让教育更美好
  7. MyBatis-Plus 的妙用(总章节目录)
  8. 小米升级android 版本最好用,安卓 6.0 落伍啦!小米旗舰可以升级 Android 7.0
  9. EXCEL单元格怎么合并 单元格数值的四舍五入方法
  10. 华为面试改革,加强考察编程,难度大增!