简述
比较两个日期,如果它们的月份/年份相同
有没有其他更好的方法来进行比较?
是的,更好的方式使用现代的 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
对象,因为您只关心年份和月份。但要达到这个目标,我们需要应用时区。年份和月份只有在特定时区的情况下才有意义,除非您来自
冰岛,否则我怀疑您不想要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 及以上版本。这些类代替了老旧的 遗留 日期时间类,例如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目现在处于 维护模式,建议迁移到 java.time 类。
了解更多信息,请参阅 Oracle 教程。并搜索 Stack Overflow 获取许多示例和解释。规范是 JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。无需字符串,也无需 java.sql.*
类。
如何获取 java.time 类?
ThreeTen-Extra 项目扩展了 java.time 的附加类。该项目是 java.time 可能未来增加的类的试验场。您可以在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
和 更多。