How to know if now time is between two hours?

37,073

Solution 1

try this

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

Solution 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
}

Solution 3

java.time

The modern way is with the java.time classes built into Java 8 and later. Much of the functionality is back-ported to Java 6 & 7 in the ThreeTen-Backport project and further adapted to Android in ThreeTenABP project.

Time zone is crucial here. For any given moment, the date and time-of-day both vary around the world by zone.

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

Get your current moment.

ZonedDateTime zdt = ZonedDateTime.now( z );

Extract the time-of-day. The Local part of the name means there is no concept of time zone contained within the object.

LocalTime lt = zdt.toLocalTime();

Define the limits of the evening.

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

Compare.

  • We need to figure out if we are straddling over a new day or within the same day. A LocalTime has no concept of date, only a single generic day of 24 hours. So we must test if the start is before or after the stop as we need different comparison algorithm for each case. And we should consider if the start equals the stop, as that may be a special case depending on your business rules.

  • In date-time work, we usually define spans of time as Half-Open, where the beginning is inclusive while the ending is exclusive.

Here's one way to do it.

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.
}

About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

Where to obtain the java.time classes?

  • Java SE 8 and SE 9 and later
    • Built-in.
    • Part of the standard Java API with a bundled implementation.
    • Java 9 adds some minor features and fixes.
  • Java SE 6 and SE 7
    • Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
  • Android

UPDATE: The above is a later version of this Answer. Below is the old.

Joda-Time

The Joda-Time library is vastly superior to the java.util.Date and .Calendar classes for date-time work.

Time zone is crucial for determine the time of day. Obviously "now" is later in the day in Paris than Montréal.

Definig a range of time is usually best done as half-open, [), where the beginning is inclusive but the ending is exclusive.

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

Solution 4

I think that this is more cleaner solution and it`s works. I have tested it with different time parameters.

        /**
         * @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);
        }

Solution 5

You can see a tutorial here with Date.before and you can do with Date.after

Also you can get his milliseconds and compare it.

Share:
37,073

Related videos on Youtube

Trancer
Author by

Trancer

Updated on October 07, 2020

Comments

  • Trancer
    Trancer over 3 years

    I have a now time:

    new Date();
    

    And I have some hour constants, for example, 23 and 8 (it's 11pm or 23:00, 8am or 08:00). How I can know is now time between it's two hour constants?

    It need to run some code of program or not to run if now time is between in two hours, for example, do not run some code if its already evening and while it is not a morning.

    Here the image to better explain:

    enter image description here

    Some situations when silent mode does not fire:

    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!!
    
    • Rohit Jain
      Rohit Jain almost 11 years
      Did you try something yet?
    • Trancer
      Trancer almost 11 years
      I try but nothing. I confuse with time's functions in java, it's really a lot of methods.
    • devnull
      devnull almost 11 years
      You want to compare only time. So Jan 1 00:00:00 GMT 2013 and Dec 31 00:00:00 GMT 2014 would be between 2 hours, right?
    • devnull
      devnull almost 11 years
      And lo! There are answers stackoverflow.com/a/17212955/2235132 to prove that!
  • Trancer
    Trancer almost 11 years
    I think it must be replaced with: if(hour <=23 && hour >=8) { // do what I need }. It is not be working if first hour is 01:00.
  • Holger
    Holger almost 11 years
    I think the if i wrote is right. I think the wants the program to run when it´s night.
  • Trancer
    Trancer almost 11 years
    Sorry, but I little bit don't understood what you said
  • Holger
    Holger almost 11 years
    It´s so simple. Just get a Calendar and then get the Hour from the Calendar. Then Check if the Hour is after 23:00 at night and before 8:00 in the morning
  • Trancer
    Trancer almost 11 years
    It seems your code works fine. I think I will use it. Only you could not tell what hour multiplied by a hundred?
  • Evgeniy Dorofeev
    Evgeniy Dorofeev almost 11 years
    it is only to make comparison simpler, otherwise we should compare hours and minutes separately
  • Holger
    Holger almost 11 years
    You have to care about 0:00 especially. E.g. if hourfrom == 0 then hourfrom = 24
  • Ali Tofigh
    Ali Tofigh over 7 years
    Could we use this code if START_HOUR = 23 and END_HOUR = 23?
  • Pallavi
    Pallavi about 7 years
    Thanks.. it helped me
  • demogorgorn
    demogorgorn almost 5 years
    thank you! it works much better than any other solutions provided here!