当前位置: 首页 > 知识库问答 >
问题:

在java中,如何检查日期是否在间隔之间?[重复]

狄宪
2023-03-14

我有六个int变量:currentmountcurrentDaymonthFromdayFrommonthUntildayUntil。我需要检查今天的月份和日期是否在从和直到变量的范围内。

例如,如果currentmount=1currentDay=2monthFrom=11dayFrom=24monthUntil=3dayUntil=3则日期在间隔内,方法应返回true。

但我不知道该怎么做。除了使用ifs检查所有可能的结果,还有其他选择吗?

共有3个答案

柳宏深
2023-03-14

您可以根据输入创建LocalDate对象,并让java进行检查。唯一的困难是确定所有这些日期应该在哪一年。

import java.time.LocalDate;

public class DateBetween {

    public static void main(String[] args) {
        System.out.println(isBetween(1, 2, 11, 24, 3, 3)); // true
        System.out.println(isBetween(4, 4, 1, 20, 6, 3)); // true
        System.out.println(isBetween(1, 1, 2, 3, 7, 8)); // false
        System.out.println(isBetween(11, 4, 2, 3, 7, 8)); // false
        System.out.println(isBetween(2, 29, 2, 3, 7, 8)); // true
        System.out.println(isBetween(2, 29, 11, 24, 3, 3)); // true
        System.out.println(isBetween(1, 1, 1, 1, 1, 1)); // true
    }

    private static boolean isBetween(int currentMonth, int currentDay, int monthFrom, int dayFrom, int monthUntil,
            int dayUntil) {
        // Default to 2000 so that Feb 29st will be valid.
        int currentYear = 2000;
        LocalDate dateFrom = LocalDate.of(currentYear, monthFrom, dayFrom);
        LocalDate dateUntil = LocalDate.of(currentYear, monthUntil, dayUntil);
        if (dateFrom.isAfter(dateUntil)) {
            // Assume dateUntil is in the next year (e.g. for 11/24/2000 -
            // 6/3/2001)
            dateUntil = dateUntil.plusYears(1);
        }
        // Day to check in current year (for non-overlapping ranges)
        LocalDate currentDateThisYear = LocalDate.of(currentYear, currentMonth, currentDay);
        // Day to check in next year (for overlapping ranges)
        LocalDate currentDateNextYear = currentDateThisYear.plusYears(1);
        if (!(currentDateThisYear.isBefore(dateFrom) || currentDateThisYear.isAfter(dateUntil))) {
            return true;
        } else if (!(currentDateNextYear.isBefore(dateFrom) || currentDateNextYear.isAfter(dateUntil))) {
            return true;
        }
        // Neither of the days to check are in the range
        return false;
    }
}

如果dateFrom之后,该方法将dateUntil视为下一年。对于重叠范围,检查当前日期和下一年的“当前”日期,例如,在“2017年11月1日”到“2018年3月1日”的范围内,您可能需要检查“12月24日”或“1月1日”。

显然,如果还可以提供currentYearyearFromyeartill,这将变得容易得多。

诸葛乐逸
2023-03-14

我建议使用java.time.MonthDay来表示所涉及的每个值。然后您需要考虑两种替代情况:

  • from之前或等于直到,在这种情况下,您需要执行from的测试

所以:

public static boolean isBetween(
    int currentMonth, int currentDay,
    int fromMonth, int fromDay,
    int untilMonth, int untilDay)
{
    MonthDay current = MonthDay.of(currentMonth, currentDay);
    MonthDay from = MonthDay.of(fromMonth, fromDay);
    MonthDay until = MonthDay.of(untilMonth, untilDay);

    if (from.compareTo(until) <= 0)
    {
        return from.compareTo(current) <= 0 &&
            current.compareTo(until) <= 0;
    }
    else
    {
        return current.compareTo(until) <= 0 ||
            current.compareTo(from) >= 0;
    }
}

这两个return语句可以合并,但不这样做可能更简单。

(这与Marvin的测试用例代码给出的结果相同。)

孟品
2023-03-14

只需使用日历快速查看范围:

注意:确保导入java.util.GregorianCalendar;

public static boolean isDateInRange(int month, int day,
                                    int monthFrom, int dayFrom,
                                    int monthUntil, int dayUntil) {
    int yearRoll = 0;
    int currentRoll = 0;
    if (monthUntil < monthFrom) yearRoll = -1; // Ensures date is calculated correctly.
    if (month >= monthFrom && yearRoll < 0) currentRoll = -1;

    GregorianCalendar testDate = new GregorianCalendar(currentRoll, month, day);
    GregorianCalendar startDate = new GregorianCalendar(yearRoll, monthFrom, dayFrom);
    GregorianCalendar endDate = new GregorianCalendar(0, monthUntil, dayUntil);

    // This makes it pass if its between OR EQUAL to the interval.
    // Remove if you only want to pass dates explicitly BETWEEN intervals.
    if (testDate.compareTo(startDate) == 0 || testDate.compareTo(endDate) == 0) {
        return true;
    }

    return !(testDate.before(startDate) || testDate.after(endDate));
}

这还将考虑到这样一个事实,即2月在11月和3月之间。由于11月是前一年的一部分,它将把日期从一年前的移回,以确保通过。

然而,它没有考虑到的是,二月闰年有额外的一天。为了增加额外的精度,你需要数年的整数。您可以执行以下操作:

public static boolean isDateInRange(int year, int month, int day,
                                    int yearFrom, int monthFrom, int dayFrom,
                                    int yearUntil, int monthUntil, int dayUntil) {

    GregorianCalendar testDate = new GregorianCalendar(year, month, day);
    GregorianCalendar startDate = new GregorianCalendar(yearFrom, monthFrom, dayFrom);
    GregorianCalendar endDate = new GregorianCalendar(yearUntil, monthUntil, dayUntil);

    return !(testDate.before(startDate) || testDate.after(endDate));
}

下面是一个实现,其中包含您给出的日期值,以及其他一些值:

public static void main(String[] args) {
    System.out.println(isDateInRange(1, 2,
                                     11, 24,
                                     3, 3));
    System.out.println(isDateInRange(11, 25,
                                     11, 24,
                                     3, 3));
    System.out.println(isDateInRange(1, 2,
                                     1, 1,
                                     3, 3));
    System.out.println(isDateInRange(1, 22,
                                     1, 21,
                                     1, 25));
}

结果是:

true
true
true
true

还将配合@Marvin的测试。

 类似资料:
  • 我有一个动态的日期列表,比如说他们相隔3个月,但是这些日期可能会变为相隔5个月、2个月等等 然后我有一个相隔一个月的日期列表。我需要做的是检查相隔1个月的列表中的哪个日期介于动态列表中的哪个月之间。 例如: 动态列表 2012年6月1日 静态列表 2012年6月1日 2012年7月1日 2012年8月1日 2012年9月1日 2012年10月1日 2012年12月1日 2013年1月1日 2013

  • 问题内容: 我有这段代码将字符串转换为日期对象 我想知道如果当前日期落在2天我的阵列中得到之间和 问题答案: 迅捷2 你已经在你的日期字符串转换的代码来。假设您在和中都有两个日期,那么您要做的就是检查当前日期是否在以下日期之间: 编辑: 如果要执行 包含 范围检查,请使用以下条件:

  • 问题内容: 在所有三个日期都由的实例表示的情况下,如何检查某个日期是否在其他两个日期之间? 问题答案: 这可能更具可读性:

  • 问题内容: 我正在使用Java应用程序,该应用程序会在用户在命令行中输入的持续时间内生成报告。用户需要以以下格式输入日期:dd-MM-yyyy 例: java报告2013年1月1日至2013年3月31日 在代码中,我将日期保存在两个字符串中。我必须确保用户输入的开始日期应该早于结束日期。是否有内置函数可以通过将这两个字符串传递给它来帮助我实现这一目标? 问题答案: 您可以使用Date.before

  • 问题内容: 我需要检查当前时间是否在8 AM和3 PM之间。如果在这些时间范围之间,那么我需要返回yes,否则返回false。 但是我不确定我应该在这里使用吗?我可以不使用时间戳并相应地检查时间戳吗?什么是正确的方法? 我仍在使用Java 7。 问题答案: 如果您使用的是Java 8之前的Java版本,请查看Joda的API文档。 具体来说,有一个AbstractInterval#contains

  • 问题内容: 在我的应用中,我创建了一个代表高中班级的对象。该对象包含2个Calendar对象,分别代表班级每天的开始和结束时间。当用户创建作业时,我要检查当前时间是否在任何课程的两次之间。如果是的话,我知道作业是在该课程中创建的。这是我当前无法使用的代码,因为.getTime()返回一个包含月和日的日期,而我只想比较小时和分钟。因此,如何修剪返回的日期,使其仅包含一天中的时间?使用joda- ti