我要求匹配两个日期,如果他们的月/年相同,我应该返回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);
答案 0 :(得分:6)
匹配两个日期,如果他们的月/年相同
还有其他更好的方法来进行比较吗?
是的,更好的方法是使用现代的 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 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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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
}
}