【问题标题】:Check if date is older than 10 years and newer than 20 years检查日期是否早于 10 年和新于 20 年
【发布时间】:2016-03-05 00:52:08
【问题描述】:

如果日期早于 10 年且晚于 20 年,我正在尝试检查 Java 8。我使用 Date.before()Date.after() 并传递 currentDate-10 年和 currentDate-20 年作为参数。

有人可以建议以日期格式获取 10 岁和 20 岁的日期以在我的 before()after() 方法中传递它的最干净的方法吗?

【问题讨论】:

  • 我对此不是 100% 确定(从未使用过之前/之后的日期),但您是否尝试过与初始化为今天的日期进行比较,然后设置另外两个日期(10 年)和 20 年前),然后使用那些方法?
  • 强烈建议不要使用 java.util.Date 和相关类。使用 java.time.*
  • @Andy897 简短回答:java.util.Date 等人有很多可变性和继承问题; java.time 是 Joda Time 的作者的官方替代品。长答案:如果它尚不存在,则值得提出一个 SO 问题。

标签: java date java-8 java-time


【解决方案1】:

使用Calendar,您可以从当前日期轻松获得 10 岁和 20 岁的日期。

Calendar calendar  = Calendar.getInstance();
calendar.add(Calendar.YEAR, -10);
Date d1 = calendar.getTime();
calendar.add(Calendar.YEAR, -10);
Date d2 = calendar.getTime();

当您使用 Java 8 时,您也可以使用 LocalDate

    LocalDate currentDate = LocalDate.now();
    Date d1 = Date.from(currentDate.minusYears(10).atStartOfDay(ZoneId.systemDefault()).toInstant());
    Date d2 = Date.from(currentDate.minusYears(20).atStartOfDay(ZoneId.systemDefault()).toInstant());

如您所说,您可以使用date.after()date.before() 方法进行比较。

    if(date.after(d1) && date.before(d2)){  //date is the Date instance that wants to be compared
        ////
    }

before()after() 方法也在 CalendarLocalDate 中实现。您可以在这些实例中使用这些方法,而无需转换为 java.util.Date 实例。

【讨论】:

  • 虽然这适用于 java 8,但我建议使用新的日期和时间 api。
  • 我以为 OP 想使用 Date.after()Date.before() 方法
  • 我试图比较 Calendar 和 Date obj。 (cal.after(d1)),它在比较 cal 时返回 false。从 2019-07-08 到 Date 从 1970-01-01(显然应该返回 true)。通过将我的d1 转换为日历来解决它。似乎比较 cal+date 不起作用。知道为什么吗?
  • @O95 如果after()方法或before()方法的参数不是Calendar类型,则返回false。查看after()before() 方法的源代码。
【解决方案2】:

您可以使用java.time.LocalDate 来执行此操作。 示例:如果您需要检查 01/01/2005 是否在该持续时间之间,您可以使用

LocalDate date = LocalDate.of(2005, 1, 1); // Assign date to check
LocalDate today = LocalDate.now();

if (date.isBefore(today.minusYears(10)) && date.isAfter(today.minusYears(20))) {
  //Do Something
}

【讨论】:

  • 我冒昧地创建了一个单独的变量来解决@SpaceTrucker 提出的问题。如果您愿意,请随时回滚。另外,请注意,此答案忽略了 timetime zone 的问题。我可能会先使用atStartOfDay 截断时间,而时区处理将取决于具体的用例。
【解决方案3】:

另一种可能性是获取要检查的日期和上限日期之间的年份数。如果年数大于 0 小于 10,则表示要检查的日期早于 10 年且晚于 20 年。

此代码将确定区间]now - 20 years ; now - 10 years[ 中的任何日期:

public static void main(String[] args) {
    LocalDate dateToCheck = LocalDate.now().minusYears(20).plusDays(1);

    LocalDate upperYear = LocalDate.now().minusYears(10);
    long yearCount = ChronoUnit.YEARS.between(dateToCheck, upperYear);
    if (yearCount > 0 && yearCount < 10) {
        System.out.println("date is older than 10 years and newer than 20 years");
    }
}

【讨论】:

  • 如果任务是“检查年龄是否在该区间内”,我会使用long l=LocalDate.now().until(dateToCheck, ChronoUnit.YEARS); if(l&lt;=-10 &amp;&amp; l&gt;-20)。但是你的答案仍然是唯一没有被问题的 XY 风格误导的答案,它专注于使用 beforeafter 而不是实际任务。请注意,x.until(y, YEARS)YEARS.between(x, y) 相同,但后者委托给前者。
  • @Holger 但是有一个小细节,我认为这将检查间隔]now - 20 years ; now - 10 years](请注意上部的包含边界)。但是 OP 没有说是否应该包含边界。
  • 嗯,你可以选择运营商&gt;&gt;= resp。 &lt;&lt;= 随你喜欢,但你不需要中间的 LocalDate 实例……
  • @Holger 我认为这更棘手。对于l&lt;=-10 &amp;&amp; l&gt;-20,包括上限。但是使用l&lt;-10 &amp;&amp; l&gt;-20,则例如上限前一天的日期将不包括在内(因为untilbetween 返回两个日期之间的完整年数)。
猜你喜欢
  • 2015-01-04
  • 2021-09-26
  • 2023-01-23
  • 2018-04-05
  • 2022-01-13
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
相关资源
最近更新 更多