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

Yah*_*din 5 java date

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

我该怎么做呢?

这看起来真的很容易,但我正在努力.

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

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

sil*_*ede 12

SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
return fmt.format(date1).equals(fmt.format(date2));
Run Code Online (Sandbox Code Playgroud)

  • 它是比较Java中两个日期的最简单方法.代码是自我解释的 (3认同)

Men*_*ild 6

虽然基于的日期组成部分给出的答案java.util.Date是足以在很多地方,我想强调的一点,一个java.util.Date不是一个日期,但以毫秒计一种UNIX的时间戳.那是什么后果?

Date-timestamps 的仅日期比较将取决于上下文的时区.例如,在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));
Run Code Online (Sandbox Code Playgroud)

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


Sou*_*hat 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));
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

今天=时间跨度

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

由于夏令时(DST)等异常情况,天数的长短不一样,并不总是24小时.在美国,有些日子长达23小时,大约25天.

半开

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

时区

时区是至关重要的,正如Meno Hochschild正确答案中所解释的那样.一天的第一时刻取决于其时区规则.

乔达时间

乔达时库具有良好的班的时间跨度处理:周期,持续时间和间隔.

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 );
Run Code Online (Sandbox Code Playgroud)

优点

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

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

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