最近用java8获取月底最后一天时间,最后一天显然是 yyyy-MM-dd 23:59:59
/**
* 得到某月最后一天时间
* @param num 基数 -1上月 0本月 1下月,2 下下月,依次类推
* @return
*/
public static Date getMonthEndTime(Long num) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime localDate = now.plusMonths(num + 1).withDayOfMonth(1).truncatedTo(ChronoUnit.DAYS).plus(-1L, ChronoUnit.SECONDS);
LocalTime localTime = LocalTime.MAX;
LocalDateTime localDateTime = LocalDateTime.of(localDate.toLocalDate(), localTime);
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
代码中获取到的日期是 2023-01-31 23:59:59 ,但是在数据库中查询显示是2023-02-01 00:00:00。虽然有1毫秒只差,但是其代表的意义已经完全不同,这显然不是我们想要的。
后来上网查询到,Mysql自动将datetime类型的毫秒数四舍五入,上边代码我获取到最大日期是2023-01-31 23:59:59.999,只是没有显示毫秒而已,四舍五入就会将9进位,从而变成下一月开始时间2023-02-01 00:00:00.0。
因此,我们可以做一个判断,决定是否要获取最后一秒的最大毫秒999,LocalTime.MAX获取到最大值是带999毫秒的,我们设置减去999毫秒,这样毫秒就为0了,到MySQL就不会进位了
/**
* 得到某月最后一天时间
* @param num 基数 -1上月 0本月 1下月,2 下下月,依次类推
* @param isIgnoreMillis true 取最小秒,忽略毫秒 fasle 取最大秒
* @return
*/
public static Date getMonthEndTime(Long num, boolean isIgnoreMillis) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime localDate = now.plusMonths(num + 1).withDayOfMonth(1).truncatedTo(ChronoUnit.DAYS).plus(-1L, ChronoUnit.SECONDS);
LocalTime localTime = LocalTime.MAX;
if (isIgnoreMillis) {
localTime = LocalTime.MAX.minus(999, ChronoUnit.MILLIS);
}
LocalDateTime localDateTime = LocalDateTime.of(localDate.toLocalDate(), localTime);
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}