Java: how do I check if a Date is within a certain range?

后端 未结 12 524
耶瑟儿~
耶瑟儿~ 2020-11-22 16:39

I have a series of ranges with start dates and end dates. I want to check to see if a date is within that range.

Date.before() and Date.after() seem to be a little a

相关标签:
12条回答
  • 2020-11-22 16:53

    Since Java 8

    NOTE: All, but one, Date's constructors are deprecated. Most of the Date's methods are deprecated. REF: Date: Deprecated Methods. All, but Date::from(Instant), static methods are deprecated.

    So, since java 8 consider using Instant (immutable, thread-safe, leap-seconds aware) type rather than Date. REF: Instant

      static final LocalTime MARKETS_OPEN = LocalTime.of(07, 00);
      static final LocalTime MARKETS_CLOSE = LocalTime.of(20, 00);
    
        // Instant utcTime = testDate.toInstant();
        var bigAppleTime = ZonedDateTime.ofInstant(utcTime, ZoneId.of("America/New_York"));
    

    within the range INCLUSIVE:

        return !bigAppleTime.toLocalTime().isBefore(MARKETS_OPEN)
            && !bigAppleTime.toLocalTime().isAfter(MARKETS_CLOSE);
    

    within the range EXCLUSIVE:

        return bigAppleTime.toLocalTime().isAfter(MARKETS_OPEN)
            && bigAppleTime.toLocalTime().isBefore(MARKETS_CLOSE);
    
    0 讨论(0)
  • 2020-11-22 16:53

    you can use like this

    Interval interval = new Interval(date1.getTime(),date2.getTime());
    Interval interval2 = new Interval(date3.getTime(), date4.getTime());
    Interval overlap = interval.overlap(interval2);
    boolean isOverlap = overlap == null ? false : true
    
    0 讨论(0)
  • 2020-11-22 16:54

    your logic would work fine . As u mentioned the dates ur getting from the database are in timestamp , You just need to convert timestamp to date first and then use this logic.

    Also dont forget to check for null dates.

    here m sharing a bit to convert from Timestamp to date.

    public static Date convertTimeStamptoDate(String val) throws Exception {

        DateFormat df = null;
        Date date = null;
    
        try {
            df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            date = df.parse(val);
            // System.out.println("Date Converted..");
            return date;
        } catch (Exception ex) {
            System.out.println(ex);
            return convertDate2(val);
        } finally {
            df = null;
            date = null;
        }
    }
    
    0 讨论(0)
  • 2020-11-22 16:57

    Consider using Joda Time. I love this library and wish it would replace the current horrible mess that are the existing Java Date and Calendar classes. It's date handling done right.

    EDIT: It's not 2009 any more, and Java 8's been out for ages. Use Java 8's built in java.time classes which are based on Joda Time, as Basil Bourque mentions above. In this case you'll want the Period class, and here's Oracle's tutorial on how to use it.

    0 讨论(0)
  • 2020-11-22 16:58

    tl;dr

    ZoneId z = ZoneId.of( "America/Montreal" );  // A date only has meaning within a specific time zone. At any given moment, the date varies around the globe by zone.
    LocalDate ld = 
        givenJavaUtilDate.toInstant()  // Convert from legacy class `Date` to modern class `Instant` using new methods added to old classes.
                         .atZone( z )  // Adjust into the time zone in order to determine date.
                         .toLocalDate();  // Extract date-only value.
    
    LocalDate today = LocalDate.now( z );  // Get today’s date for specific time zone.
    LocalDate kwanzaaStart = today.withMonth( Month.DECEMBER ).withDayOfMonth( 26 );  // Kwanzaa starts on Boxing Day, day after Christmas.
    LocalDate kwanzaaStop = kwanzaaStart.plusWeeks( 1 );  // Kwanzaa lasts one week.
    Boolean isDateInKwanzaaThisYear = (
        ( ! today.isBefore( kwanzaaStart ) ) // Short way to say "is equal to or is after".
        &&
        today.isBefore( kwanzaaStop )  // Half-Open span of time, beginning inclusive, ending is *exclusive*.
    )
    

    Half-Open

    Date-time work commonly employs the "Half-Open" approach to defining a span of time. The beginning is inclusive while the ending is exclusive. So a week starting on a Monday runs up to, but does not include, the following Monday.

    java.time

    Java 8 and later comes with the java.time framework built-in. Supplants the old troublesome classes including java.util.Date/.Calendar and SimpleDateFormat. Inspired by the successful Joda-Time library. Defined by JSR 310. Extended by the ThreeTen-Extra project.

    An Instant is a moment on the timeline in UTC with nanosecond resolution.

    Instant

    Convert your java.util.Date objects to Instant objects.

    Instant start = myJUDateStart.toInstant();
    Instant stop = …
    

    If getting java.sql.Timestamp objects through JDBC from a database, convert to java.time.Instant in a similar way. A java.sql.Timestamp is already in UTC so no need to worry about time zones.

    Instant start = mySqlTimestamp.toInstant() ;
    Instant stop = …
    

    Get the current moment for comparison.

    Instant now = Instant.now();
    

    Compare using the methods isBefore, isAfter, and equals.

    Boolean containsNow = ( ! now.isBefore( start ) ) && ( now.isBefore( stop ) ) ;
    

    LocalDate

    Perhaps you want to work with only the date, not the time-of-day.

    The LocalDate class represents a date-only value, without time-of-day and without time zone.

    LocalDate start = LocalDate.of( 2016 , 1 , 1 ) ;
    LocalDate stop = LocalDate.of( 2016 , 1 , 23 ) ;
    

    To get the current date, specify a time zone. At any given moment, today’s date varies by time zone. For example, a new day dawns earlier in Paris than in Montréal.

    LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
    

    We can use the isEqual, isBefore, and isAfter methods to compare. In date-time work we commonly use the Half-Open approach where the beginning of a span of time is inclusive while the ending is exclusive.

    Boolean containsToday = ( ! today.isBefore( start ) ) && ( today.isBefore( stop ) ) ;
    

    Interval

    If you chose to add the ThreeTen-Extra library to your project, you could use the Interval class to define a span of time. That class offers methods to test if the interval contains, abuts, encloses, or overlaps other date-times/intervals.

    The Interval class works on Instant objects. The Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds (up to nine (9) digits of a decimal fraction).

    We can adjust the LocalDate into a specific moment, the first moment of the day, by specifying a time zone to get a ZonedDateTime. From there we can get back to UTC by extracting a Instant.

    ZoneId z = ZoneId.of( "America/Montreal" );
    Interval interval = 
        Interval.of( 
            start.atStartOfDay( z ).toInstant() , 
            stop.atStartOfDay( z ).toInstant() );
    Instant now = Instant.now();
    Boolean containsNow = interval.contains( now );
    

    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
    • The ThreeTenABP project adapts ThreeTen-Backport (mentioned above) for Android specifically.
    • See How to use….

    The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

    0 讨论(0)
  • 2020-11-22 16:59

    Doesnn't care which date boundry is which.

    Math.abs(date1.getTime() - date2.getTime()) == 
        Math.abs(date1.getTime() - dateBetween.getTime()) + Math.abs(dateBetween.getTime() - date2.getTime());
    
    0 讨论(0)
提交回复
热议问题