如何检查Java中的两个日期是否在同一天

时间:2014-03-16 16:11:46

标签: java date

我有2个日期变量,Date1和Date2。 我想检查日期1是否与Date2在同一天(但允许它们有不同的时间)。

我该怎么做?

这看起来真的很容易,但我很挣扎。

编辑:我想避免使用外部库和东西

编辑: 我的组织想法是删除小时,分钟,秒,但这些功能在Java中标记为折旧。那我应该怎么用????

5 个答案:

答案 0 :(得分:10)

SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
return fmt.format(date1).equals(fmt.format(date2));

答案 1 :(得分:6)

虽然根据java.util.Date的日期组成部分给出的答案在很多方面都已足够,但我要强调一点java.util.Date 一个日期而是一种UNIX时间戳的测量单位,以毫秒为单位。结果是什么?

Date的日期比较 - 时间戳将取决于上下文的时区。例如,在UTC时区中,仅日期比较是直接的,最后只比较年,月和日组件,请参阅其他答案(我不需要重复)。

但请考虑一下2011年西萨摩亚跨越国际日期的情况。您可以拥有java.util.Date类型的有效时间戳,但如果您在萨摩亚考虑他们的日期部分,您甚至可以获得无效日期(2011年) -12-30从未在萨摩亚当地存在过)因此只比较日期部分可能会失败。此外,根据时区,日期组件通常可以与UTC区域中的本地日期相差一天,提前或落后,在最坏的情况下甚至会有两天的差异。

因此,对解决方案的扩展稍微更精确:

SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
fmt.setTimeZone(...); // your time zone
return fmt.format(date1).equals(fmt.format(date2));

对于首先将j.u.Date-timestamp转换为java.util.GregorianCalendar,然后设置时区然后比较日期组件的程序化方法,也存在类似的扩展。

答案 2 :(得分:5)

为什么不简单地比较年,月和日?你可以编写你的方法,如:

private boolean isDateSame(Calendar c1, Calendar c2) {
    return (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR) && 
            c1.get(Calendar.MONTH) == c2.get(Calendar.MONTH) &&
            c1.get(Calendar.DAY_OF_MONTH) == c2.get(Calendar.DAY_OF_MONTH));
}

答案 3 :(得分:5)

今天=时间跨度

虽然其他答案可能是正确的,但我更倾向于我们认识到“今天”实际上是一段时间的方法。

由于夏令时(DST)等异常情况,天数长短不一,而且总是24小时不等。在美国,有些日子是23个小时,大约25个小时。

半开

通常在数据时工作中,我们使用“半开”策略,其中跨度的开头是包含性的,结尾是独占的。所以这意味着“今天”从今天的第一个时刻开始,但不包括明天的第一个时刻。

时区

correct answer by Meno Hochschild中所述,时区至关重要。一天的第一时刻取决于其时区规则。

约达时间

Joda-Time库有很好的类来处理时间跨度:句点,持续时间和Interval

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime now = new DateTime( timeZone );
Interval today = new Interval( now.withTimeAtStartOfDay(), now.plusDays(1).withTimeAtStartOfDay() );

DateTime dateTimeInQuestion = new DateTime( date ); // Convert java.util.Date.
boolean happensToday = today.contains( dateTimeInQuestion );

优势

使用一段时间的这种方法有很多好处:

  • 避免夏令时(DST)问题
  • 允许您比较其他时区的日期时间值
  • 灵活,因此您可以将相同类型的代码用于其他跨度(多天,几个月等)。
  • 让你的思维从日历日期(分层抽象)转移到日期时间作为流动时间轴上的点(基本事实)。

Java 8内置了一个新的java.time package。这些新类以Joda-Time为模型,但完全重新构建。可以使用java.time编写相同类型的代码。

答案 4 :(得分:0)

当你使用toString()方法时,你会得到什么?它只是年/月/日或时间吗?如果是,那么你可以简单地比较两个对象的字符串。 (date1.toString()等于(date2.toString())。);