相比于JDK1.8之前的SimpleDateFormat以及Calendar等API带来的易误用、线程不安全等问题,JDK1.8提供了LocalDate,LocalTime,LocalDateTime三个主要的类进行时间处理,设计和使用基本与JodaTime相似。

基本用法

    public static void main(String[] args) {
//只包含日期
LocalDate now = LocalDate.now();
System.out.println("日期:" + now);
LocalDate date = LocalDate.of(2020, 12, 1);
System.out.println("自由组装日期:" + date);
System.out.println("年:" + date.getYear() + ";月:" + date.getMonthValue() + ";日:" + date.getDayOfMonth());
//with指定某个属性
System.out.println("指定1997年的今天:" + now.withYear(1997));
System.out.println("----------------------------"); //只包含了时间
LocalTime time = LocalTime.now();
System.out.println("时间:" + time);
System.out.println("带格式的时间" + time.format(DateTimeFormatter.ISO_TIME));
System.out.println("自由组装日期:" + LocalTime.of(14, 32, 21));
System.out.println("时:" + time.getHour() + ";分:" + time.getMinute() + ";秒:" + time.getSecond());
System.out.println("----------------------------"); //包含了日期和时间
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("默认的ISO标准格式:" + dateTime.format(DateTimeFormatter.ISO_DATE_TIME));
//常用的yyyy-MM-dd HH:mm:ss格式
System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println("----------------------------"); //时间的后延、前移
System.out.println(dateTime.plusDays(3).format(DateTimeFormatter.ISO_DATE_TIME));
System.out.println(dateTime.minusHours(8).format(DateTimeFormatter.ISO_DATE_TIME));
//时间的比较,前后、相等、是否闰年...
LocalDateTime minusHours = dateTime.minusHours(1);
System.out.println(dateTime + "比" + minusHours + "更晚:" + dateTime.isAfter(minusHours));
//日期和时间类型转换为另外两种类型
LocalDate toLocalDate = dateTime.toLocalDate();
System.out.println("被转换的日期:" + toLocalDate);
LocalTime toLocalTime = dateTime.toLocalTime();
System.out.println("被转换的时间:" + toLocalTime);
System.out.println("----------------------------"); //字符串转换时间
System.out.println(LocalDate.parse("2011-03-02").getDayOfMonth());
System.out.println(LocalDateTime.parse("2020-03-01T12:01:01").getMonthValue());
}

结果:

使用TemporalAdjusters指定特殊时间

    public static void main(String[] args) {
//使用TemporalAdjusters指定特殊时间
LocalDate now = LocalDate.now();
System.out.println("匹配日期 " + now + " -- " + now.getDayOfWeek());
System.out.println("-------------------------------------------");
//匹配日期当月第一天、最后一天
System.out.println("匹配日期当月第一天 " + now.with(TemporalAdjusters.firstDayOfMonth()));
System.out.println("匹配日期当月最后一天 " + now.with(TemporalAdjusters.lastDayOfMonth()));
//匹配日期下月的第一天
System.out.println("匹配日期下月的第一天 " + now.with(TemporalAdjusters.firstDayOfNextMonth())); //匹配日期当年第一天、最后一天
System.out.println("匹配日期当年第一天 " + now.with(TemporalAdjusters.firstDayOfYear()));
System.out.println("匹配日期当年最后一天" + now.with(TemporalAdjusters.lastDayOfYear()));
//匹配日期下年的第一天
System.out.println("匹配日期下年的第一天 " + now.with(TemporalAdjusters.firstDayOfNextYear()));
//一个月中的第一个、最后一个星期几
System.out.println("匹配日期当月中的第一个星期一 " + now.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));
System.out.println("匹配日期当月中的最后一个星期一 " + now.with(TemporalAdjusters.lastInMonth(DayOfWeek.MONDAY)));
//匹配日期当月的第几个星期几
System.out.println("匹配日期当月的第2个星期一 " + now.with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.MONDAY))); //匹配日期(now)过后(不含匹配日期当天)的第一个星期几
System.out.println("匹配日期当月的下一个星期一(不含今日) " + now.with(TemporalAdjusters.next(DayOfWeek.MONDAY)));
//匹配日期(now)过后(含匹配日期当天)的第一个星期几
System.out.println("匹配日期当月的下一个星期一(含今日) " + now.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY)));
//匹配日期(now)之前(不含匹配日期当天)的第一个星期几
System.out.println("匹配日期当月的上一个星期一(不含今日) " + now.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)));
//匹配日期(now)之前(不含匹配日期当天)的第一个星期几
System.out.println("匹配日期当月的上一个星期一(不含今日) " + now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)));
}

结果:

TemporalAdjuster接口处理自定义逻辑

    public static void main(String[] args) {
//使用TemporalAdjuster接口自定义匹配时间
//2022-03-14
LocalDate now = LocalDate.now();
LocalDate nextWeekDay = now.with(new TemporalAdjuster() {
@Override
public Temporal adjustInto(Temporal temporal) {
LocalDate inputDate = (LocalDate) temporal;
if (inputDate.getDayOfWeek() == DayOfWeek.FRIDAY) {
return inputDate.plusDays(3);
} else if (inputDate.getDayOfWeek() == DayOfWeek.SATURDAY) {
return inputDate.plusDays(2);
} else {
return inputDate.plusDays(1);
}
}
});
System.out.println(nextWeekDay);
//2022-03-15
}

Instant(略)

主要是用来获取时间戳,和从计算机元年到现在的时间间隔秒数/纳秒数,一来涉及到时区问题,二来System.currentMilliSeconds()本身也能获取到时间戳,此部分就略过。

Duration与Period计算时间间隔

    public static void main(String[] args) {
//Duration计算时间差--LocalDateTime
LocalDateTime now = LocalDateTime.now();
LocalDateTime yesterday = now.minusDays(1);
System.out.println(Duration.between(yesterday, now).toHours()); //Duration计算时间差--LocalTime
LocalTime time = LocalTime.now();
LocalTime hoursAgo = time.minusHours(1);
System.out.println(Duration.between(hoursAgo, time).toMinutes()); //计算日期差
LocalDate date = LocalDate.now();
LocalDate tenThousandDaysAgo = date.minusDays(10000);
Period period = Period.between(tenThousandDaysAgo, date);
System.out.println("万日之前距今已相隔" + period.getYears() + "年" + period.getMonths() + "月" + period.getDays() + "日");
}

24
60
万日之前距今已相隔27年4月15日

ZonedDate、ZonedTime、ZonedDateTime

这个三个类方法及用法和 LocalDate、 LocalTime、 LocalDateTime 基本一样,只不过ZonedDate,ZonedTime、ZonedDateTime 这三个带有当前系统的默认时区的时间表示类。相关的还有ZoneID类。

JDK1.8中的时间处理API的更多相关文章

  1. Java 中的时间日期 API

    自从 14 年发布 Java 8 以后,我们古老 java.util.Date 终于不再是我们 Java 里操作日期时间的唯一的选择. 其实 Java 里的日期时间的相关 API 一直为世猿诟病,不仅 ...

  2. java8 中的时间和数据的变化

    java8除了lambda表达式之外还对时间和数组这两块常用API做想应调整, Stream 有几个常用函数: store 排序 (a,b)-> a.compareTo(b)  排出来的结果是正 ...

  3. 如何在JDK1.8中愉快地处理日期和时间

    如何在JDK1.8中愉快地处理日期和时间 JDK1.8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了. ...

  4. Java中日期时间API小结

    Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hol ...

  5. Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题【转】

    Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题 http://blog.didispace.com/Spring-Boot-And-Feign- ...

  6. Java日期时间API系列39-----中文语句中的时间语义识别(time NLP 输入一句话,能识别出话里的时间)原理分析

    NLP (Natural Language Processing) 是人工智能(AI)的一个子领域.自然语言是人类智慧的结晶,自然语言处理是人工智能中最为困难的问题之一(来自百度百科). 其中中文更是 ...

  7. Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题

    LocalDate.LocalTime.LocalDateTime是Java 8开始提供的时间日期API,主要用来优化Java 8以前对于时间日期的处理操作.然而,我们在使用Spring Boot或使 ...

  8. 时间工具类之“ JDK1.8中 LocalDate、LocalTime、LocalDateTime、LocalDateTimeUtil四个时间工具类”

    一.使用的原因 在JDK8发布的时候,推出了LocalDate.LocalTime.LocalDateTime这个三个时间处理类,以此来弥补之前的日期时间类的不足,简化日期时间的操作. 在Java8之 ...

  9. Windows 商店应用中使用 SharePoint REST API

    前面一篇我们介绍了 Office 365 REST API 的官方工具的使用,本篇我们来看一下 SharePoint REST API 本身的描述.结构和使用方法,以及一些使用经验. 首先来看看Sha ...

  10. JDK1.7 中的HashMap源码分析

    一.源码地址: 源码地址:http://docs.oracle.com/javase/7/docs/api/ 二.数据结构 JDK1.7中采用数组+链表的形式,HashMap是一个Entry<K ...

随机推荐

  1. react native 更改项目包名

    修改工程名,需要以下几个步骤: 修改android/app/build.gradle里的applicationId,为新包名,譬如:com.xxx.yyy.myProject 修改android/ap ...

  2. 2022-3-28内部群每日三题-清辉PMP

    1.由于一直重复执行相同的任务,一个敏捷团队的士气低落.敏捷管理专业人士(主题专家 SME)应采取哪一项行动? A.增加团队的资源数量,协助主题专家完成任务. B.让团队成员执行其活动的价值流分析. ...

  3. 服务器部署 halo博客项目

    2020-8-9 13:45:14 有个进阶方法!  如果静态资源加载缓慢如图片,头像  则用CDN加速  (确实很秀!) https://cdn.jsdelivr.net/gh/你的用户名/你的仓库 ...

  4. Window/linux(docker) 单台宿主机部署多个Jenkins节点

    Window/linux(docker) 单台宿主机部署多个Jenkins节点 在使用Jenkins过程中,增加了手动输入的步骤,会阻塞节点运行任务: 由于资源有限,需要在一台机器挂载了很多Jenki ...

  5. Qt中QGraphicsScene和QraphicsView显示坐标问题解决

    相信打开这个界面的你,一定遇到了这两玩意儿设置完坐标发现对不上的问题...查询Qt官方文档后发现: 网上搜索了一番,基本上这个坐标系就是长酱紫: 所以加上这行代码就行了: ui->graphic ...

  6. jdk版本与项目依赖jar包不兼容

    这两天出现了一个 java.lang.RuntimeException: java.io.IOException: invalid constant type: 18 tomcat启动出现这个问题的原 ...

  7. L2 Gracia Final OpCodz

    [83] Gracia Final Client 00 SendLogOut 01 RequestAttack 03 RequestStartPledgeWar 04 RequestReplyStar ...

  8. postman-error:SyntaxError: Invalid shorthand property initializer

    SyntaxError: Invalid shorthand property initializer 速记属性初始值设定项无效 原因:

  9. SQL-增删改

    -- 删除表drop table -- 建表create table -- 表注释comment on table ... is ...-- 字段注释comment on column ... is ...

  10. iview 自定义指令实现Table左右横向拖拽

    有时候表格内容会很多,需要横向滚动查看右边的内容,又不想到底部拖动滚动条,如果能直接在内容中拖动就好了,这个时候就可以用 vue 的自定义指令来实现了. 为了以后扩展指令方便,创建 directive ...