java计算两个日期之间相差天数和相隔天数详解

        大家看到文章标题"两个日期之间相差天数和相隔天数",是否有疑惑呢!从中文字面理解,”相差“和"相隔"是有区别的,然而就是这些区别害死很多人,却没有发现,在大量新增统计时是差之毫厘谬以千里,我能都发现是因为一个偶然的机会,一个项目运行几年却没有人发现,我在其中还不到一年,一开始写这些这代码的人根本没分清楚什么情况就写了,怪不得统计的数据总是有那么细微的差别,在于日期”相差“和"相隔"有某些特定的情况下是相等的,有时又不相等。大家看我写那么多也是醉了。下面直接进入正题。


  • 两个日期之间相差天数

    平时大家都在讨论两个日期之间相差天数,网上大把代码也是关于两个日期之间相差天数,因为相差在人的脑中已经根深了,在我管理的工程里也有这样的代码,如下所示

public static int getDiscrepantDays(Date dateStart, Date dateEnd) {
		return (int) ((dateEnd.getTime() - dateStart.getTime()) / 1000 / 60 / 60 / 24);
	}

这个方法的功能就是传入开始和结束日期,计算相差的天数,实现思路是通过java.util.Date类的getTime()方法获得日期的毫秒数,

然后相减dateEnd.getTime() - dateStart.getTime(),得到毫秒数的差,除以1000,得到秒数的差;再除以60,得到分钟数的差;再除以60,得到小时数的差;再除以24小时,得到天数的差。这就是计算两个日期之间相差天数的思路。网上大部分代码都和这个大同小异,下面重点解决下两个日期之间相隔天数。


  • 两个日期之间相隔天数

相隔并不是相差,只要是同一天,相隔就是0,不是同一天,相隔就不是0,但对于两日期相差的天数就不一样,不是同一天,相差天数也可以为0.

相差天数例子,

开始日期为:2015-05-28 23:59:59,结束日期为:2015-05-29 00:00:00,相差为1秒,相差天数为0,

开始日期为:2015-05-28 11:00:00,结束日期为:2015-05-29 10:59:59,相差天数也为0,差1秒,相差天数为1。

相隔天数例子,

开始日期为:2015-05-28 23:59:59,结束日期为:2015-05-29 00:00:00,相差为1秒,相隔天数为1,

开始日期为:2015-05-28 11:00:00,结束日期为:2015-05-29 10:59:59,相差天数也为0,差1秒,相隔天数还是为1。

到这里,读者应该知道区别在那里了吧,如果用相差天数的思路求相隔天数必然是错的。


相隔天数的代码如下:



相隔天数的代码只要变通下,格式化加上时间,就变成了计算相差天数的代码:



到这里,计算两个日期之间相差天数和相隔天数实现代码已讲完。如果统计的日志数据生成在不同天的表两种方法得到结果决然不同,对于几百万级表的信息查询,得到的结果相差就非常大了。所有开发时要根据自己的业务慎重选择合适的计算方法。只能说细节决定成败!有用的话希望大家分享分享。









  • 12
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以通过以下两种方式计算两个日期之间相隔天数: 1. 使用Java 8中的新API Java 8中提供了新的日期时间API,可以通过`java.time`包下的类来计算两个日期之间相隔天数,具体实现如下: ```java import java.time.LocalDate; import java.time.temporal.ChronoUnit; public class DateUtils { public static long getDaysBetweenTwoDates(LocalDate startDate, LocalDate endDate) { return ChronoUnit.DAYS.between(startDate, endDate); } } ``` 在上面的代码中,我们使用了`ChronoUnit`类的`DAYS`字段来表示计算相隔天数。接着调用`between()`方法,传入起始日期和结束日期即可计算相隔天数。 2. 使用Java 7及以下版本的API 在Java 7及以下版本中,可以使用`java.util.Calendar`类来计算两个日期之间相隔天数,具体实现如下: ```java import java.util.Calendar; public class DateUtils { public static int getDaysBetweenTwoDates(Calendar startDate, Calendar endDate) { int daysBetween = 0; while (startDate.before(endDate)) { startDate.add(Calendar.DAY_OF_MONTH, 1); daysBetween++; } return daysBetween; } } ``` 在上面的代码中,我们使用了`Calendar`类的`before()`方法来判断起始日期是否早于结束日期。接着,我们通过`add()`方法将起始日期往后推一天,并累加相隔天数,直到起始日期与结束日期相等为止。 需要注意的是,以上两种方式计算相隔天数的结果可能会因为夏令时、时区等因素导致不准确。如果需要更精确的计算,可以使用第一种方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值