今天我们说说 Java 8 新的时间 API,由于之前的api并不理想也存在问题。所以出现了一套全新的日期API,在java.time路径下。
LocalDate
LocalDate类型包含了年月日信息,下面举些LocalDate的使用示例:
LocalDate date = LocalDate.of(2019,4,20);// 2019-07-04
int year = date.getYear();// 2019
int month = date.getMonth().getValue();// 7
int day = date.getDayOfMonth();// 4
// 查看该月有多少天
intdays = date.lengthOfMonth();// 31
// 是否是闰年
booleanisLeap = date.isLeapYear();
// 查看当天 年月日
LocalDate today = LocalDate.now();// 2019-07-04
除了调用LocalDate的getYear方法外,我们也可以使用ChronoField枚举类型来实现相同的功能:
int year1 = date.get(ChronoField.YEAR);// 2019
int month1 = date.get(ChronoField.MONTH_OF_YEAR);// 7
int day1 = date.get(ChronoField.DAY_OF_MONTH);// 4
// 当前日期属于该月第几周
int weekOfMonth = date.get(ChronoField.ALIGNED_WEEK_OF_MONTH);// 1
ChronoField枚举类型包含了诸多的属性可供选择:
修改 LocalDate 对象
LocalDate date3 = LocalDate.of(2018,4,20);// 2018-04-20
LocalDate date4 = date3.withDayOfMonth(22);// 2018-04-22
LocalDate date5 = date3.with(ChronoField.DAY_OF_MONTH,22);// 2018-04-22
LocalDate date6 = date3.withYear(2019);// 2019-04-20
LocalDate date7 = date3.plusDays(5);// 2018-04-25
LocalDate date8 = date3.plus(5, ChronoUnit.DAYS);// 2018-04-25
LocalDate date9 = date3.minusYears(10);// 2008-04-20
TemporalAdjusters类提供了许多静态方法来修改LocalDate对象。当我们需要获取下一个周天,下一个工作日,本月的最后一天等信息时,TemporalAdjusters类便可派上用场:
importstaticjava.time.temporal.TemporalAdjusters.*;
LocalDate date10 = date3.with(nextOrSame(DayOfWeek.MONDAY));// 2018-04-23
LocalDate date11 = date3.with(lastDayOfMonth());// 2018-04-30
LocalDate date12 = date3.with(previous(DayOfWeek.SATURDAY));// 2018-04-14
格式化
String str1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);// 20190704
String str2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);// 2019-07-04
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String str5 = date.format(dtf);// 2019-07-04
LocalDate date13 = LocalDate.parse(str5, dtf);// 2019-07-04
LocalDate和下面要介绍的LocalTime,LocalDateTime之间共享了许多类似的方法,上面介绍的LocalDate修改、格式化等方法通用适用于LocalTime和LocalDateTime。
LocalTime
LocalTime和LocalDate类似,区别在于LocalTime包含的是时分秒(毫秒)信息。举些LocalTime的例子:
LocalTime time = LocalTime.of(20,13,54);// 20:13:54
int hour = time.getHour();// 20
int minute = time.getMinute();// 13
int second = time.getSecond();// 54
LocalDate和LocalTime都可以通过字符串来创建:
LocalDate date = LocalDate.parse("2019-04-20");
LocalTime time = LocalTime.parse("20:13:54");
LocalDateTime
LocalDateTime是LocalDate和LocalTime的组合形式,包含了年月日时分秒信息。举些LocalDateTime的使用示例:
LocalDateTime ldt1 = LocalDateTime.of(2018,4,20,20,13,54);// 2018-04-20T20:13:54
LocalDateTime ldt2 = LocalDateTime.of(date, time);// 2019-04-20T20:13:54
LocalDateTime可以转换为LocalDate和LocalTime,转换后包含的信息减少了:
LocalDate date1 = ldt1.toLocalDate();// 2019-04-20
LocalTime time1 = ldt1.toLocalTime();// 20:13:54
Duration
Duration用于计算两个LocalTime或者LocalDateTime的时间差,例如:
LocalTime time2 = LocalTime.of(23,59,59);
Duration duration = Duration.between(time1, time2);
longseconds = duration.getSeconds();// 13565
time1和time2之间相差了13565秒。
手动创建Duration对象:
Duration threeMinutes = Duration.ofMinutes(3);
threeMinutes = Duration.of(3, ChronoUnit.MINUTES);// 创建了一个3分钟的Duration,两种创建方式等价
Period
Period用于计算两个LocalDate之间的时长。举些例子:
LocalDate date2 = LocalDate.of(2018,5,21);
Period period = Period.between(date1, date2);
int monthsBetween = period.getMonths();// 1
int daysBetween = period.getDays();// 1
2018-04-21和2018-04-20之间月份相差1,天数相差1。
同样的,我们也可以手动创建Period对象:
Period tenDays = Period.ofDays(10);
Period threeWeeks = Period.ofWeeks(3);
Period twoYearsSixMonthsOneDay = Period.of(2,6,1);
比较两个时间的先后
LocalDate date15 = LocalDate.of(2018,4,21);
date.isEqual(date15);// false
date.isAfter(date15);// false
date.isBefore(date15);// true
MonthDay 使用
MonthDay只包含月日信息,可以用于存放类似于生日,结婚纪念日等信息。举个使用MonthDay的例子:
LocalDate birthday = LocalDate.of(1999,9,9);
MonthDay monthDay = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(LocalDate.now());
if(currentMonthDay.equals(monthDay)) {
System.out.println("happy birthday!");
}
假如用户的生日是1999年9月9号,那么可以通过这种方法来判断今天是否是用户的生日,如果是的话便发送生日祝福。同样的也有YearMonth类,只包含 年月信息。就不啰嗦了。
最后
本号专注Java源码分析。喜欢底层源码的朋友可以来交流探讨。交流群:818491202 验证:88