解决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());
	}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值