相比于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类。

最新文章

  1. Android 自动化测试—robotium(六) 通过命令行执行Robotium自动化测试用例及导出报告
  2. 【性能诊断】六、并发场景的性能分析(windbg案例,大量的内部异常造成CPU飙升)
  3. .net 学习资源(转)
  4. 济南学习 Day 2 T3 am
  5. http://msh.baidu.com/UTWpR6wY4722
  6. javascript--时钟
  7. CentOS 7 服务器配置--配置Tomcat开机启动
  8. Sitecore8.2 Tracker.Current is not initialized错误
  9. cf1000E We Need More Bosses (tarjan缩点+树的直径)
  10. Typescript 学习笔记六:接口
  11. MySQL数据备份之mysqldump使用(转)
  12. 使用WinDbg下的gflags工具导致程序无法执行
  13. Angular routing生成路由和路由的跳转
  14. Javascript php 异常捕获
  15. C# 创建txt文本
  16. How To Allow Blocked Content on Internet Explorer
  17. JavaScript实现把数字转换成中文
  18. 20145325张梓靖 实验二"Java面向对象程序设计"
  19. jython研究笔记
  20. Python——学好Python必读的几篇文章

热门文章

  1. Java基础之基本运算符
  2. MongoDB 4.0 dump备份脚本
  3. Web Dynpro for ABAP(15):Print
  4. Docker安装 Redis Stack(开发适配-提供 Redis Stack 服务器和RedisInsight可视化) (6.2.4-v2版本)
  5. 下载低版本Xcode方法
  6. react 学习笔记更新2.0
  7. 前端将JSON数据格式化显示
  8. centos/redhat 多路径存储使用 - 客户端
  9. ssr next 学习记录
  10. 1.2 Git&Github