I'm trying to detect with Moment.js if a given date is between two dates. Since version 2.0.0, Tim added isBefore()
and isAfter()
for date comparison.
Since there's no isBetween()
method, I thought this would work:
var date = moment("15/02/2013", "DD/MM/YYYY");
var startDate = moment("12/01/2013", "DD/MM/YYYY");
var endDate = moment("15/01/2013", "DD/MM/YYYY");
if (date.isBefore(endDate) && date.isAfter(startDate) || (date.isSame(startDate) || date.isSame(endDate)) ) { alert("Yay!"); } else { alert("Nay! :("); }
I'm convinced there's got to be a better way to do this. Any ideas?
In versions 2.9+ there is an isBetween
function, but it's exclusive:
var compareDate = moment("15/02/2013", "DD/MM/YYYY");
var startDate = moment("12/01/2013", "DD/MM/YYYY");
var endDate = moment("15/01/2013", "DD/MM/YYYY");
// omitting the optional third parameter, 'units'
compareDate.isBetween(startDate, endDate); //false in this case
There is an inclusive workaround ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)
... which is logically equivalent to
!(x.isBefore(a) || x.isAfter(b))
In version 2.13 the isBetween
function has a fourth optional parameter, inclusivity
.
Use it like this:
target.isBetween(start, finish, 'days', '()') // default exclusive
target.isBetween(start, finish, 'days', '(]') // right inclusive
target.isBetween(start, finish, 'days', '[)') // left inclusive
target.isBetween(start, finish, 'days', '[]') // all inclusive
More units to consider: years, months, days, hours, minutes, seconds, milliseconds
Note: units are still optional. Use null
as the third argument to disregard units in which case milliseconds is the default granularity.
You can use one of the moment plugin -> moment-range to deal with date range:
var startDate = new Date(2013, 1, 12)
, endDate = new Date(2013, 1, 15)
, date = new Date(2013, 2, 15)
, range = moment().range(startDate, endDate);
range.contains(date); // false
You can use
moment().isSameOrBefore(Moment|String|Number|Date|Array);
moment().isSameOrAfter(Moment|String|Number|Date|Array);
or
moment().isBetween(moment-like, moment-like);
See here : http://momentjs.com/docs/#/query/
I do believe that
if (startDate <= date && date <= endDate) {
alert("Yay");
} else {
alert("Nay! :(");
}
works too...
Good news everyone, there's an isBetween
function! Update your library ;)
Please use the 4th parameter of moment.isBetween function (inclusivity). Example:
var startDate = moment("15/02/2013", "DD/MM/YYYY");
var endDate = moment("20/02/2013", "DD/MM/YYYY");
var testDate = moment("15/02/2013", "DD/MM/YYYY");
testDate.isBetween(startDate, endDate, 'days', true); // will return true
testDate.isBetween(startDate, endDate, 'days', false); // will return false
if (date.isBefore(endDate)
&& date.isAfter(startDate)
|| (date.isSame(startDate) || date.isSame(endDate))
is logically the same as
if (!(date.isBefore(startDate) || date.isAfter(endDate)))
which saves you a couple of lines of code and (in some cases) method calls.
Might be easier than pulling in a whole plugin if you only want to do this once or twice.
As Per documentation of moment js,
There is Precise Range plugin, written by Rob Dawson, can be used to display exact, human-readable representations of date/time ranges, url : http://codebox.org.uk/pages/moment-date-range-plugin
moment("2014-01-01 12:00:00").preciseDiff("2015-03-04 16:05:06");
// 1 year 2 months 3 days 4 hours 5 minutes 6 seconds
moment.preciseDiff("2014-01-01 12:00:00", "2014-04-20 12:00:00");
// 3 months 19 days
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.