SimpleDateFormat解析日期字符串导致分钟数增加的问题

在java中经常使用SimpleDateFormat来解析日期字符串,我在使用过程中发现一个意外的现象,当SimpleDateFormat指定yyyy-MM-dd HH:mm:ss.SSS格式,解析2025-01-15 10:16:00.123123的时候,给出的时间是2025-01-15 10:18:03.123,这不是我预期的结果,预期的结果是2025-01-15 10:16:00.123。

这是怎么回事呢?打着研究透彻的想法,我看了下jdk的实现源码。SimpleDateFormat的内部实现是采用Calendar类来构造日期的,在SimpleDateFormat里有个成员是PATTERN_INDEX_TO_CALENDAR_FIELD,这个成员将SimpleDateFormat解析出来的年月日时分秒毫秒tag转为Calendar中对应的fieldNo,然后将日期字符串中的值一个个设置到Calendar里。

这里就是出问题的地方,SimpleDateFormat会将整个123123认为是毫秒设置进Calendar中,如此计算123123就是123秒123毫秒,这就导致分钟数增加了。

Java中,有多种方法可以获取两个时间字符串相差的分钟,以下为你介绍两种常见的实现方式: ### 方式一:使用`SimpleDateFormat`和`Date`类 这种方式的核心思路是先将时间字符串通过`SimpleDateFormat`解析为`Date`对象,再获取两个`Date`对象的毫秒差值,最后将毫秒差值转换分钟。示例代码如下: ```java import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class TimeDifferenceInMinutes { public static void main(String[] args) { String time1 = "10:30"; String time2 = "12:15"; SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); Date date1 = null; Date date2 = null; try { date1 = sdf.parse(time1); date2 = sdf.parse(time2); } catch (ParseException e) { System.err.println("时间转换异常!"); } if (date1 != null && date2 != null) { long diff = Math.abs(date2.getTime() - date1.getTime()); long minutes = diff / (60 * 1000); System.out.println("两个时间相差:" + minutes + " 分钟"); } } } ``` 上述代码参考了通过`SimpleDateFormat`解析时间字符串为`Date`对象,获取毫秒差值并转换分钟的思路 [^1]。 ### 方式二:使用`DateUtil`(Hutool工具类) 若使用Hutool工具类,可借助`DateUtil`的`between`方法轻松计算两个时间的差值。示例代码如下: ```java import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateTime; public class TimeDifferenceWithHutool { public static void main(String[] args) { String day1 = "2024-07-10 10:00:00"; String day2 = "2024-07-10 12:16:20"; DateTime dateTime1 = DateUtil.parse(day1); DateTime dateTime2 = DateUtil.parse(day2); long between = DateUtil.between(dateTime1, dateTime2, DateUnit.MINUTE); System.out.println("两个时间相差:" + between + " 分钟"); } } ``` 此代码参考了使用`DateUtil`的`between`方法计算两个时间字符串差值的示例 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值