Как проверить, попадает ли данное время в указанный временной диапазон - PullRequest
0 голосов
/ 29 января 2020

Я хочу проверить, находится ли мое значение Date от -

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

в диапазоне с 10:00 до 18:00.

Я нашел несколько похожих ссылок на похожий вопрос StackOverflow и использовал часть кода из этой темы.

Все, что я хочу проверить, находится ли текущее время в любом часовом поясе в диапазоне от 10 до 18 часов. Если Да, выведите «yes», иначе выведите «no».

В настоящее время для кода ниже:

    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());

Он просто печатает время 10:11 утра 1970 года. Примерно так: пт 02 января 10:11:13 IST 1970.

Но я хочу проверить, попадает ли текущая или будущая дата в интервал с 10 до 18 часов. * 10101

Ниже код ссылки:

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

Ответы [ 3 ]

2 голосов
/ 29 января 2020

Это не очень понятно. Для этого ответа я предполагаю, что все ваше время следует понимать в часовом поясе Америки / Чика go. Пожалуйста, вернитесь, если это не то, что вы хотели.

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 чика go время), вывод был:

Да

Я использую java .time, современный Java API даты и времени, и рекомендую вам сделать то же самое. С ним гораздо приятнее работать, чем со старыми, устаревшими и плохо спроектированными классами Date, SimpleDateFormat, Calendar и TimeZone.

A LocalTime - это время суток с 00: С 00 (включительно) до 24:00 (без исключений). Сравнивая объекты LocalTime, мы игнорируем дату и не имеем проблем с не относящимися к делу датами 1970 года или какого-то другого времени в истории.

Редактирование:

Также возможно получить дата и время rangeStart и rangeEnd, чтобы проверить, для какого конкретного дня и времени мы проверяем условия?

Нет, это не имеет смысла. Поскольку LocalTime - это время суток без даты , невозможно получить из нее дату. Но вы можете распечатать ZonedDateTime и проверить его часть даты. И чтобы убедиться, что код верен, напишите несколько модульных тестов.

Ссылка: Oracle учебное пособие: Дата и время , объясняющие, как использовать java. время.

1 голос
/ 29 января 2020

Простой подход может состоять в том, чтобы проанализировать ваше время String с экземплярами LocalTime и сравнить их. Вы должны решить, являются ли время начала и окончания включительно или нет ...

Поддерживает некоторые форматирования, потому что вам, возможно, придется передавать String s с AM / PM или без:

public static boolean isInTimeSlot(String time, String timeSlotStart, String timeSlotEnd) {
    // create a formatter that supports different formats for the String arguments
    DateTimeFormatter parserDtf = DateTimeFormatter.ofPattern("[hh:mm:ss a][HH:mm:ss][h a]");
    // parse each argument to a LocalTime
    LocalTime timeOfDay = LocalTime.parse(time, parserDtf);
    LocalTime fromTime = LocalTime.parse(timeSlotStart, parserDtf);
    LocalTime toTime = LocalTime.parse(timeSlotEnd, parserDtf);
    // and return if the given time is in the time slot (including start and end time)
    return timeOfDay.equals(fromTime) || timeOfDay.equals(toTime)
            || (timeOfDay.isAfter(fromTime) && timeOfDay.isBefore(toTime));
}

Если вы запустите его в main, как это

public static void main(String[] args) {
    // provide some sample times
    String[] times = { "10:31:17", "09:59:59", "6 PM", "4 AM", "06:00:01 PM" };
    // provide a time slot
    String from = "10 AM";
    String to = "6 PM";

    // check the method for each time string
    for (String time : times) {
        if (isInTimeSlot(time, from, to)) {
            System.out.println(time + " is in the time slot at or between "
                                + from + " and " + to);
        } else {
            System.err.println(time + " is not in the time slot at or between " 
                                + from + " and " + to);
        }
    }
}

, результат будет

10:31:17 is in the time slot at or between 10 AM and 6 PM
09:59:59 is not in the time slot at or between 10 AM and 6 PM
6 PM is in the time slot at or between 10 AM and 6 PM
4 AM is not in the time slot at or between 10 AM and 6 PM
06:00:01 PM is not in the time slot at or between 10 AM and 6 PM
1 голос
/ 29 января 2020

Все, что я хочу проверить, находится ли текущее время из любого часового пояса в диапазоне от 10 до 18 часов. Если да, выведите «yes», иначе выведите «no».

. Для этого следующий код выполнит эту работу.

LocalTime lt = LocalTime.now();
if( lt.isAfter( LocalTime.of( 10, 0 ) ) && lt.isBefore( LocalTime.of( 18, 0 ) ) ) System.out.println( "Yes" );
else System.out.println( "No" );

, поскольку у вас есть Date экземпляров с Вы можете преобразовать их в LocalTime экземпляров, как показано ниже, и использовать тот же механизм сравнения.

Date d = new Date(); //Change this to your way of creating the Date instance
LocalTime lt = LocalDateTime.ofEpochSecond( d.getTime(), 0, ZoneOffset.ofHours( 0 ) ).toLocalTime();

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...