Подтвердить что ты не робот

Как узнать, находится ли сейчас время между двумя часами?

У меня есть время:

new Date();

И у меня есть некоторые постоянные часа, например 23 и 8 (это 11:00 или 23:00, 8:00 или 08:00). Как я могу знать, теперь между ними между двумя часовыми константами?

Ему нужно запустить какой-то код программы или не запускать, если теперь время между двумя часами, например, не запускайте какой-либо код, если его уже вечером и пока это не утро.

Вот изображение, чтобы лучше объяснить:

введите описание изображения здесь

Некоторые ситуации, когда тихий режим не срабатывает:

00:00 20.06.13 - 23:00 20.06.13 // after 23.00 can loud!!

23:00 20.06.13 - 15:00 20.06.13 // after 15.00 can loud!!

01:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!

21:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!
4b9b3361

Ответ 1

попробуйте это

    int from = 2300;
    int to = 800;
    Date date = new Date();
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    int t = c.get(Calendar.HOUR_OF_DAY) * 100 + c.get(Calendar.MINUTE);
    boolean isBetween = to > from && t >= from && t <= to || to < from && (t >= from || t <= to);

Ответ 2

Calendar cal = Calendar.getInstance(); //Create Calendar-Object
cal.setTime(new Date());               //Set the Calendar to now
int hour = cal.get(Calendar.HOUR_OF_DAY); //Get the hour from the calendar
if(hour <= 23 && hour >= 8)              // Check if hour is between 8 am and 11pm
{
     // do whatever you want
}

Ответ 3

Вы можете увидеть учебник здесь с помощью Date.before, и вы можете сделать с Date.after

Также вы можете получить его миллисекунды и сравнить его.

Ответ 4

java.time

Современный путь - это классы java.time, встроенные в Java 8 и более поздние версии. Большая часть функциональных возможностей была перенесена на Java 6 и 7 в проект ThreeTen-Backport и далее адаптирована для Android в проекте ThreeTenABP.

Здесь очень важен часовой пояс. В любой момент времени дата и время суток изменяются по всему миру по зонам.

ZoneId z = ZoneId.of( "America/Montreal" );

Получите ваш текущий момент.

ZonedDateTime zdt = ZonedDateTime.now( z );

Извлечь время суток. Часть имени Local означает, что в этом объекте отсутствует понятие часового пояса.

LocalTime lt = zdt.toLocalTime();

Определите границы вечера.

LocalTime start = LocalTime.of( 23 , 0 );  // 11 PM.
LocalTime stop = LocalTime.of( 8 , 0 );  // 8 AM.

Сравнить.

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

  • В работе с датой мы обычно определяем промежутки времени как Half-Open, где начало включено, в то время как окончание является эксклюзивным.

Вот один из способов сделать это.

Boolean silentRunning = null ;
if( start.equals( stop ) ) {
    silentRunning = Boolean.FALSE ;
} else if( stop.isAfter( start ) ) {  // Example 3 PM to 6 PM.
    silentRunning = ( ! lt.isBefore( start ) ) && lt.isBefore( stop ) ;
} else if ( stop.isBefore( start ) ) {  // Example 11 PM to 8 AM.
    silentRunning = ( lt.equals( start ) || lt.isAfter( start ) ) && lt.isBefore( stop ) ;
} else {
    // Error. Should not reach this point. Paranoid check.
}

О java.time

Структура java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь в режим обслуживания, советуем перейти к классам java.time.

Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.

Где получить классы java.time?

  • Java SE 8 и SE 9 и позже
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональных возможностей java.time обратно переносится на Java 6 и 7 в ThreeTen-Backport.
  • Android

ОБНОВЛЕНИЕ: Вышеупомянутая версия является более поздней версией этого ответа. Ниже приведен старый.

Joda времени

Библиотека Joda-Time значительно превосходит классы java.util.Date и .Calendar для работы с датой.

Часовой пояс имеет решающее значение для определения времени суток. Очевидно, что "сейчас" позже в Париже, чем в Монреале.

Определить, что диапазон времени обычно лучше всего делать как полуоткрытый, [), где начало включено, но окончание является эксклюзивным.

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );
Integer hour = now.getHourOfDay();
Boolean isNight = ( ( hour >= 23  ) && ( hour < 8 ) );

Ответ 5

Я думаю, что это более чистое решение, и оно работает. Я тестировал его с разными временными параметрами.

        /**
         * @param fromHour Start Time
         * @param toHour Stop Time
         * @param now Current Time
         * @return true if Current Time is between fromHour and toHour
         */
        boolean isTimeBetweenTwoHours(int fromHour, int toHour, Calendar now) {
            //Start Time
            Calendar from = Calendar.getInstance();
            from.set(Calendar.HOUR_OF_DAY, fromHour);
            from.set(Calendar.MINUTE, 0);
            //Stop Time
            Calendar to = Calendar.getInstance();
            to.set(Calendar.HOUR_OF_DAY, toHour);
            to.set(Calendar.MINUTE, 0);

            if(to.before(from)) {
                if (now.after(to)) to.add(Calendar.DATE, 1);
                else from.add(Calendar.DATE, -1);
            }
            return now.after(from) && now.before(to);
        }

Ответ 6

вот функция, которая теперь проверяет (текущее время) либо между 1 - 4 ИЛИ От 4 до 8 ИЛИ 8 до 12 ИЛИ От 12 до 16 ИЛИ От 16 до 20 ИЛИ 20 к 1 и возвращает следующее время затухания.

закрытый календарь GetTimeDiff() выдает ParseException {

Календарь в настоящее время = Calendar.getInstance();

     Calendar one = Calendar.getInstance();
      one.set(Calendar.HOUR_OF_DAY, 1);
      one.set(Calendar.MINUTE, 0);
      one.set(Calendar.SECOND, 0);


      Calendar four = Calendar.getInstance();
      four.set(Calendar.HOUR_OF_DAY, 4);
      four.set(Calendar.MINUTE, 0);
      four.set(Calendar.SECOND, 0);


      Calendar eight = Calendar.getInstance();
      eight.set(Calendar.HOUR_OF_DAY, 8);
      eight.set(Calendar.MINUTE, 0);
      eight.set(Calendar.SECOND, 0);


      Calendar twelve = Calendar.getInstance();
      twelve.set(Calendar.HOUR_OF_DAY, 12);
      twelve.set(Calendar.MINUTE, 0);
      twelve.set(Calendar.SECOND, 0);


      Calendar sixteen = Calendar.getInstance();
      sixteen.set(Calendar.HOUR_OF_DAY, 16);
      sixteen.set(Calendar.MINUTE, 0);
      sixteen.set(Calendar.SECOND, 0);


      Calendar twenty = Calendar.getInstance();
      twenty.set(Calendar.HOUR_OF_DAY, 20);
      twenty.set(Calendar.MINUTE, 0);
      twenty.set(Calendar.SECOND, 0);



        if(now.getTime().after(one.getTime()) && now.getTime().before(four.getTime())) {


            return four;

        } if(now.getTime().after(four.getTime()) && now.getTime().before(eight.getTime())) {

            return eight;


         } if(now.getTime().after(eight.getTime()) && now.getTime().before(twelve.getTime())) {


             return twelve;

         } if(now.getTime().after(twelve.getTime()) && now.getTime().before(sixteen.getTime())) {


             return sixteen;

         } if(now.getTime().after(sixteen.getTime()) && now.getTime().before(twenty.getTime())) {


             return twenty;


         } if(now.getTime().after(twenty.getTime()) && now.getTime().before(one.getTime())) {


             return one;

         }

        return now;
}

Ответ 7

Вы также можете преобразовать свою входную строку в целое число и сравнить ее с вашими константами. Таким образом, вам даже не нужно работать с объектами Calendar и Date.

public class testDateRange {

    static final int START_HOUR = 8;
    static final int END_HOUR = 23;

    public static void main(String[] args) {
        String now_time = new SimpleDateFormat("HH:mm").format(new Date());
        System.err.println(isInRange(Integer.parseInt(now_time.replace(":","")),START_HOUR*100,END_HOUR*100));

    }

    private static boolean isInRange(int now_time, int start_time, int end_time) {

       if ((now_time>start_time)&&
               (now_time<end_time)       )
       {
        return true;
       }
        return false;
    }

}