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 awkward to use. What I really need is something like this pseudocode:
boolean isWithinRange(Date testDate) {
return testDate >= startDate && testDate <= endDate;
}
Not sure if it's relevant, but the dates I'm pulling from the database have timestamps.
This was clearer to me,
An easy way is to convert the dates into milliseconds after January 1, 1970 (use Date.getTime()) and then compare these values.
tl;dr
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.
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.
Get the current moment for comparison.
Compare using the methods isBefore, isAfter, and equals.
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.To get the current date, specify a time zone. For any given moment, today’s date varies by time zone. For example, a new day dawns earlier in Paris than in Montréal.
We can use the
isEqual
,isBefore
, andisAfter
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.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 onInstant
objects. TheInstant
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 aZonedDateTime
. From there we can get back to UTC by extracting aInstant
.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?
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.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 below. In this case you'll want the Period class, and here's Oracle's tutorial on how to use it.
you can use like this