Java 8之新日期时间API笔记(一)LocalDate

背景:

鉴于Java 8之前的日期时间API的不便捷。Java 8推出了全新的日期时间API,加上最近项目里面对日期和时间的操作比较多,所以把常用的方法整理记录到这里。

简介

新的日期时间API在java.time包下。主要的类有如下几个:

  1. LocalDate:表示日期类(eg:2018-06-17)
  2. LocalTime:表示时间类(eg: 15:23:34)
  3. LocalDateTime:表示日期和时间类 (eg:2018-06-17 15:23:34)
  4. ZoneId:用来表示时区
  5. Instant:用来表示时间线上的某点
  6. Clock:时钟类,类似其他语言中的时钟类。通过Clock可以精确获取时间
  7. Duration:以时分秒为单位统计时间周期
  8. Period:以年月日为单位统计时间周期

LocalDate

LocalDate代表了一个ISO-8601标准格式的日期(eg:2018-06-17)。他是线程安全的不可变类型。构造方法是私有的,只能通过工厂方法初始化。

常用的工厂方法如下

1.of方法:

LocalDate localDate = LocalDate.of(2018, 7, 3);

2.parse方法:

  LocalDate localDate = LocalDate.parse("2018-07-03");

通过now方法快速获取系统所在时区当前日期

LocalDate localDate = LocalDate.now();

快速获取年,月,日等数据

final int year = localDate.getYear(); // 获取localDate所在年份
final Month month = localDate.getMonth(); //获取localDate所在月份
final int monthValue = localDate.getMonthValue(); //获取localDate所在月份的数字表示,range(1, 12)
final int dayOfYear = localDate.getDayOfYear(); //获取localDate当前日期是一年中第几天, range(1, 366)
final int dayOfMonth = localDate.getDayOfMonth(); //获取localDate当前日期所在月第几天,range(1, 31)
final DayOfWeek dayOfWeek = localDate.getDayOfWeek();//获取localDate当前日期是星期几
final boolean isLeapYear = localDate.isLeapYear(); //判断是否是闰年,很方便。

修改当前日期

1.修改年份

localDate = localDate.withYear(1988);//修改当前年份为1988
localDate = localDate.plusYears(1);//在当前年份上加一年
localDate = localDate.minusYears(1);//在当前年份上减一年

2.修改月份

localDate = localDate.withMonth(3);//修改当前月份为3月
localDate = localDate.plusMonths(1);//在当前月份上加一个月
localDate = localDate.minusMonths(1);//在当前月份上减一个月

3.修改日期

localDate = localDate.withDayOfMonth(3);//修改日期为当月的3号
localDate = localDate.withDayOfYear(133);//修改日期为当年的第133天
localDate = localDate.plusDays(1);//在当前日期上加一天
localDate = localDate.plusWeeks(1);//在当前日期上加一周
localDate = localDate.minusWeeks(1);//在当前日期上减一周
localDate = localDate.minusDays(1);//在当前日期上减一天

4.日期比较

int result = localDateA.compareTo(localDateB);//A > B => result > 0; A == B => result == 0; A < B => result < 0;
localDateA.isBefore(localDateB);
localDateA.isAfter(localDateB);
localDateA.isEqual(localDateB);
long period = localDateA.toEpochDay() - localDateB.toEpochDay();//获取两个日期相差多少天

5.时间调整者
有的时候我们需要的时间不是一些确定的时间,而是一些概念上的。比如这个月的第一天,最后一天,下个周末等等。新版的Java日期API提供了这样获取时间的方式就是TemporalAdjusters类。

localDate = localDate.with(TemporalAdjusters.firstDayOfMonth()); //获取本月第一天
localDate = localDate.with(TemporalAdjusters.lastDayOfYear());//获取今年最后一天

Ps:TemporalAdjusters还提供了很多方法,如果还不能满足需求可以自己实现TemporalAdjuster接口
6.获取本地星期
有时候我们需要给本地用户提供可以理解的星期表示,DayOfWeek通过传入Locale可以返回用户可以理解的星期字符串

DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
String displayName = dayOfWeek.getDisplayName(TextStyle.FULL, Locale.CHINA);//eg:星期三

总结

新版的Java时间API非常好用,以前很多需要自己编写代码处理的地方,现在都直接提供了API。这篇主要学习LocalDate的使用,还有很多需要学习的地方,下一篇学习LocalTime的使用方法。