java - 比较月份和年份的两个日期值

时间:2016-03-12 03:14:30

标签: java date date-comparison

我要求匹配两个日期,如果他们的月/年相同,我应该返回true,否则为false。根据我的搜索,我找到了以下解决方案。还有其他更好的方法来进行这种比较吗?

Calendar cal1 = Calendar.getInstance();
    Calendar cal2 = Calendar.getInstance();
    cal1.setTime(date1);
    cal2.setTime(date2);
    boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
                      cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH);

3 个答案:

答案 0 :(得分:6)

TL;博士

  

匹配两个日期,如果他们的月/年相同

     

还有其他更好的方法来进行比较吗?

是的,更好的方法是使用现代的 java.time 类。

YearMonth.from(                                   // Represent the year-month without a day-of-month, without a time-of-day, and without a time zone.
    LocalDate.of( 2018 , Month.JANUARY , 23 ) ,   // Represent a date-only, without a time-of-day and without a time zone.
)                                                 // Returns a `YearMonth` object.
.equals(                                          // Compare one `YearMonth` object to another.
    YearMonth.now()                               // Capture today’s year-month as seen in the JVM’s current default time zone.
)

详细

是的,还有更好的方法。

您正在使用与最早版本的Java捆绑在一起的旧日期时间类。事实证明,这些课程设计糟糕,令人困惑且麻烦。避免使用它们,包括java.util.Date。

java.time

这些旧类已被Java 8及更高版本中内置的java.time框架所取代。

Instant

将给定的java.util.Date对象转换为Instant个对象,在UTC的时间轴上。

Instant i1 = myJavaUtilDate1.toInstant();
Instant i2 = myJavaUtilDate2.toInstant();

我们的目标是获取YearMonth个对象,因为您只关心年份和月份。但要实现这一目标,我们需要应用时区。年份和月份仅在特定时区的上下文中有意义,除非您来自Iceland我怀疑您想要UTC的年/月背景。

ZoneId

因此我们需要指定所需/预期的时区(ZoneId)。

ZoneId zoneId = ZoneId.of( "America/Montreal" );

ZonedDateTime

将该时区应用于每个Instant,生成ZonedDateTime个对象。

ZonedDateTime zdt1 = ZonedDateTime.ofInstant( i1 , zoneId );
ZonedDateTime zdt2 = ZonedDateTime.ofInstant( i2 , zoneId );

YearMonth

现在提取YearMonth个对象。

YearMonth ym1 = YearMonth.from( zdt1 );
YearMonth ym2 = YearMonth.from( zdt2 );

比较

Boolean same = ym1.equals( ym2 );

顺便说一下,您可能还有其他涉及年份和月份的业务逻辑。请记住,java.time类现在内置于Java中。因此,您可以在整个代码库中使用并传递YearMonth个对象,而不是重新计算或传递字符串。

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:1)

您可以使用date1.getYear() == date2.getYear() && date1.getMonth() == date2.getMonth()

答案 2 :(得分:1)

快速方式: 有了JodaTime库。

  • 首先,请确保已下载/实现了它。
  • 然后导入。
import org.joda.time.LocalDate;
import java.util.Date;
  • 您在这里:
Date Date1 = new Date();
Date Date2 = new Date();

if (new LocalDate(Date1).getYear() == new LocalDate(Date2).getYear()) {
 // Year Matches
 if (new LocalDate(Date1).getMonthOfYear() == new LocalDate(Date2).getMonthOfYear()) {
  // Year and Month Matches
 }
}