以前遇到日期都是直接百度,很不爽,现在总结一下。
提示:日期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(); // 2019date.getMonth().getValue(); // 9date.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.132LocalTime.now().withNano(0); // 10:08:32# 指定时间LocalTime time = LocalTime.of(14, 10, 21); //14:10:21LocalTime 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();
参考
这短短的一生我们最终都会失去,不放大胆一点,爱一个人、攀一座山、追一个梦!
