以前遇到日期都是直接百度,很不爽,现在总结一下。
提示:日期plus函数都是返回一个新值,原来的值不变。
常用类
LocalDate
# 当前日期
LocalDate.now()
$ 2019-09-01
# 新建日期
LocalDate.of(1990, 10, 12);
LocalDate.parse("2019-09-09") // 默认格式
LocalDate.parse("20190909",DateTimeFormatter.ofPattern("yyyyMMdd")) // 指定格式
# 日期属性
LocalDate date = LocalDate.parse("2019-09-09");
date.getYear(); // 2019
date.getMonth().getValue(); // 9
date.getDayOfMonth(); // 9
# 第一天
LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()); // 当月第一天
LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth()); // 下个月第一天
LocalDate.now().with(TemporalAdjusters.firstDayOfNextYear()); // 下一年的第一天
LocalDate.now().with(TemporalAdjusters.firstDayOfYear()); // 今年的第一天
LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 当月第一个周一
$ 2019-09-01
$ 2019-10-01
$ 2020-01-01
$ 2019-01-01
$ 2019-09-02
# 最后一天
LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()); // 当月最后一天
LocalDate.now().with(TemporalAdjusters.lastDayOfYear()); // 当年最后一天
LocalDate.now().with(TemporalAdjusters.lastInMonth(DayOfWeek.MONDAY)); // 当月最后一个周一
$ 2019-09-30
$ 2019-12-31
$ 2019-09-30
# 当月第几个周一
LocalDate.now().with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.MONDAY)) // 当月第二个周一
$ 2019-09-09
# 日期加减
LocalDate.now().plusDays(1);
LocalDate.now().plusMonths(1);
LocalDate.now().plusWeeks(1);
LocalDate.now().plusYears(1);
# 日期比较和判断
LocalDate.now().isLeapYear(); // 是否是闰年
LocalDate.now().isAfter(LocalDate.now().plusDays(1)); // 日期比较
LocalDate.now().isBefore(LocalDate.now().plusDays(1)); // 日期比较
LocalDate.now().isEqual(LocalDate.now()); // 日期比较
$ false
$ false
$ true
$ true
LocalTime
# 获取当前时间
LocalTime.now(); // 10:08:32.132
LocalTime.now().withNano(0); // 10:08:32
# 指定时间
LocalTime time = LocalTime.of(14, 10, 21); //14:10:21
LocalTime time2 = LocalTime.parse("12:00:01"); // 12:00:01
# 修改时间
LocalTime.now().plusHours(1);
LocalTime.now().plusMinutes(1);
LocalTime.now().plusSeconds(1);
LocalTime.now().plusNanos(1);
# 日期比较
now.isBefore(now.plusHours(1)) // true
LocalDateTime
集合了LocalDate和LocalTime,方法大部分都是共通的,比如 创建、修改。
Instant
类似 System.currentTimeMillis() , 可以精确到纳秒,但是我测试的时候毫秒级别后面都是0。
我们可以用它来计算任务执行时间差。
Instant start = Instant.now();
for (int i = 0; i < 2000; i++) {
Thread.sleep(1);
}
Instant end = Instant.now();
Duration between = Duration.between(start, end);
System.out.println(between.toMillis()); // 毫秒,也可以转换成day minutes
日期差值
可以使用until来计算,原生的Period不太符合我们的要求。但是要注意,两个日期类型要保持一致。
LocalDateTime now = LocalDateTime.now();
LocalDateTime now2 = now.plusHours(1);
System.out.println(now.until(now2, ChronoUnit.HOURS));
日期转换
LocalDate转Date
LocalDate nowLocalDate = LocalDate.now();
Date date = Date.from(localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant());
LocalDateTime转Date
LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());
Date转LocalDateTime(LocalDate)
Date date = new Date();
LocalDateTime localDateTime = date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
LocalDate localDate = date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDate();
LocalDate转时间戳
LocalDate localDate = LocalDate.now();
long timestamp = localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant().toEpochMilli();
LocalDateTime转时间戳
LocalDateTime localDateTime = LocalDateTime.now();
long timestamp = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
时间戳转LocalDateTime(LocalDate)
long timestamp = System.currentTimeMillis();
LocalDate localDate = Instant.ofEpochMilli(timestamp).atZone(ZoneOffset.ofHours(8)).toLocalDate();
LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
参考
这短短的一生我们最终都会失去,不放大胆一点,爱一个人、攀一座山、追一个梦!