Java中如何去除Instant类型返回值的小数点?解决IllegalFormatConversionException异常
看起来你在这里踩了两个小坑:一个是String.format的格式化符用错了类型,另一个是代码逻辑有点偏差——把分钟数值转成Instant其实不是你需要的操作(毕竟你要的是给用户看的分钟数,不是时间点)。让我一步步帮你解决:
先解释报错原因
你遇到的java.util.IllegalFormatConversionException: M != java.time.Instant,是因为%tM这个格式化标记是给旧的java.util.Date或java.util.Calendar这类传统日期类型设计的,不能直接传入java.time.Instant,类型不匹配才抛出了这个错误。
针对你的需求的正确解法
你的核心需求是:从DTO的Instant类型sla字段中提取分钟数,以纯整数形式(比如24)展示在邮件里,去掉默认的小数点后缀。根据你可能的实际场景,分两种情况给出代码:
场景1:获取UTC时间中的「当前小时分钟数」(比如15:24:00 UTC → 24)
如果是想拿到该时间点对应的UTC时间里的分钟部分(范围0-59),直接用ZonedDateTime转换后提取即可,返回的是整数类型,天然没有小数点:
// 把Instant转换为UTC时区的时间对象 ZonedDateTime utcDateTime = dto.getSla().atZone(ZoneOffset.UTC); // 提取当前小时的分钟数(int类型,无小数) int minute = utcDateTime.getMinute(); // 转成字符串用于邮件展示,结果就是"24"这种纯整数格式 String minuteForEmail = String.valueOf(minute);
场景2:获取从纪元到该Instant的「总分钟数」
如果是想计算该时间点距离1970-01-01T00:00:00Z的总分钟数,直接用纪元秒数计算即可:
// 获取Instant对应的总纪元秒数 long totalSeconds = dto.getSla().getEpochSecond(); // 计算总分钟数(整数除法自动舍弃余数,结果为纯整数) long totalMinutes = totalSeconds / 60; // 转成字符串用于邮件展示 String totalMinutesForEmail = String.valueOf(totalMinutes);
最后纠正你原代码的逻辑偏差
你原代码里的subCategory.setSla(Instant.parse(...))其实是没必要的——Instant代表的是一个具体的时间点,而你要的是给用户看的分钟数值,这两者不是一个概念。如果subCategory的sla字段需要存储原始的时间点,直接保留dto.getSla()的值即可,只需要把提取出的分钟数单独拿出来用于邮件展示。
内容的提问来源于stack exchange,提问作者Curious

