gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:25:35 31 4
gpt4 key购买 nike

我需要匹配两个日期,如果他们的月/年相同,我应该返回 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);

最佳答案

tl;博士

match two dates and if their month/year are same

Is there any other better way to do this comparison?



是的,更好的方法是使用现代 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 及更高版本中的框架。
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.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 类?
  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 ,以及更高版本 - 标准 Java API 的一部分,具有捆绑的实现。
  • Java 9 添加了一些小功能和修复。
  • Java SE 6Java SE 7
  • ThreeTen-Backport 中,大部分 java.time 功能被反向移植到 Java 6 和 7。 .
  • Android
  • 更高版本的 Android 捆绑实现 java.time 类。
  • 对于早期的 Android (<26),ThreeTenABP项目适应 ThreeTen-Backport (上文提到的)。见 How to use ThreeTenABP… .

  • ThreeTen-Extra项目使用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

    关于java - 比较月份和年份的两个日期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35953319/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com