解决MySQL datetime类型时间毫秒四舍五入问题

 最近用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());
	}

你可能感兴趣的:(MySQL,mysql,数据库)