首页 > 解决方案 > 如何检查给定时间是否在提到的时间范围内

问题描述

我想检查我的日期值是否来自 -

Date d = convertCurrentTimeToSpecificTimeZone("America/Chicago", 2, 30);

在上午 10 点到下午 6 点之间。

我在 StackOverflow类似问题上找到了一些类似的链接,并使用了该线程中的一些代码。

我只想检查任何时区的当前时间是否在上午 10 点到下午 6 点之间。如果是,则打印“是”,否则打印“否”。

目前用于以下代码:

    String string1 = "10:11:13";
    Date time1 = new SimpleDateFormat("HH:mm:ss").parse(string1);
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(time1);
    calendar1.add(Calendar.DATE, 1);
    System.out.println(calendar1.getTime().toString());

它只打印 1970 年的上午 10:11 时间。像这样 - 1970 年 1 月 2 日星期五 10:11:13 IST。

但我想检查今天或任何未来的日期时间是否在上午 10 点到下午 6 点之间。

下面是代码参考:

public static Date convertCurrentTimeToSpecificTimeZone(String timeZone, int increaseDateBy,
        int increaseMinutesBy) {
    Calendar calendar = Calendar.getInstance();
    TimeZone fromTimeZone = calendar.getTimeZone();
    TimeZone toTimeZone = TimeZone.getTimeZone(timeZone);
    calendar.setTimeZone(fromTimeZone);
    calendar.add(Calendar.MILLISECOND, fromTimeZone.getRawOffset() * -1);
    if (fromTimeZone.inDaylightTime(calendar.getTime())) {
        calendar.add(Calendar.MILLISECOND, calendar.getTimeZone().getDSTSavings() * -1);
    }
    calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset());
    if (toTimeZone.inDaylightTime(calendar.getTime())) {
        calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings());
    }
    increaseCalenderDateBy(calendar, increaseDateBy);
    increaseCalenderMinuteBy(calendar, increaseMinutesBy);
    return calendar.getTime();
}

public static void getTimeBetweenRange() throws ParseException {
    String string1 = "10:11:13";
    Date time1 = new SimpleDateFormat("HH:mm:ss").parse(string1);
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(time1);
    calendar1.add(Calendar.DATE, 1);
    System.out.println(calendar1.getTime().toString());

    String string2 = "18:49:00";
    Date time2 = new SimpleDateFormat("HH:mm:ss").parse(string2);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(time2);
    calendar2.add(Calendar.DATE, 1);
    System.out.println(calendar2.getTime().toString());

    Date d = convertCurrentTimeToSpecificTimeZone("America/Chicago", 2, 30);
    Calendar calendar3 = Calendar.getInstance();
    calendar3.setTime(d);
    System.out.println(calendar3.getTime().toString());

    Date x = calendar3.getTime();
    if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) {
        // checkes whether the current time is between 14:49:00 and 20:11:13.
        System.out.println(true);
    } else
        System.out.println(false);
}

所以我下面代码的输出是:

Fri Jan 02 10:11:13 IST 1970
Fri Jan 02 18:49:00 IST 1970
Fri Jan 31 03:15:07 IST 2020

标签: javadatetimecalendarrange

解决方案


这不是很清楚。对于这个答案,我假设您的所有时间都将在美国/芝加哥时区进行理解。如果这不是您想要的,请还原。

java.time

    ZoneId zone = ZoneId.of("America/Chicago");

    ZonedDateTime zdt = ZonedDateTime.now(zone).plusDays(2).plusMinutes(30);

    LocalTime rangeStart = LocalTime.parse("10:11:13");
    LocalTime rangeEnd = LocalTime.parse("18:49:00");

    LocalTime time = zdt.toLocalTime();
    if (!time.isBefore(rangeStart) && time.isBefore(rangeEnd)) {
        System.out.println("Yes");
    } else {
        System.out.println("No");
    }

当我刚才(芝加哥时间 11:30)运行此代码段时,输出为:

是的

我正在使用现代 Java 日期和时间 API java.time,并建议您也这样做。它比旧的、过时的和设计不佳的类DateSimpleDateFormat和.CalendarTimeZone

ALocalTime是一天中从 00:00(含)到 24:00(不含)的时间。通过比较LocalTime对象,我们忽略了日期,并且对于 1970 年或历史上其他时间的不相关日期没有任何问题。

编辑:

还有可能获取 rangeStart 和 rangeEnd 的日期和时间,以验证我们正在检查条件的特定日期和时间吗?

不,那没有意义。由于 a是没有 dateLocalTime的一天中的时间,因此无法从中获取日期。但是您可以打印并验证其日期部分。为了确保代码是正确的,编写一些单元测试。ZonedDateTime

链接: Oracle 教程:解释如何使用 java.time 的日期时间。


推荐阅读