Перевірте, чи є одна дата між двома датами


82

Мені потрібно перевірити, чи a date- рядок у dd/mm/yyyyформаті - не потрапляє між двома іншими датами з однаковим форматомdd/mm/yyyy

Я спробував це, але це не працює:

var dateFrom = "02/05/2013";
var dateTo = "02/09/2013";
var dateCheck = "02/07/2013";

var from = Date.parse(dateFrom);
var to   = Date.parse(dateTo);
var check = Date.parse(dateCheck );

if((check <= to && check >= from))      
    alert("date contained");

Я використовував налагоджувач і перевіряв, змінні toand fromмають isNaNзначення. Не могли б ви мені допомогти?


Даніеле, потрібно оновити правильну відповідь. Відповідь із більшою кількістю голосів не перевіряє дати лише на місяці

Відповіді:


106

Date.parseпідтримує формат mm/dd/yyyyне dd/mm/yyyy. Для останнього або використовуйте бібліотеку, як moment.js, або зробіть щось, як показано нижче

var dateFrom = "02/05/2013";
var dateTo = "02/09/2013";
var dateCheck = "02/07/2013";

var d1 = dateFrom.split("/");
var d2 = dateTo.split("/");
var c = dateCheck.split("/");

var from = new Date(d1[2], parseInt(d1[1])-1, d1[0]);  // -1 because months are from 0 to 11
var to   = new Date(d2[2], parseInt(d2[1])-1, d2[0]);
var check = new Date(c[2], parseInt(c[1])-1, c[0]);

console.log(check > from && check < to)

2
+1 за правильний синтаксичний аналіз рядка дати і не залишаючи його залежним від реалізації синтаксичним аналізатором.
RobG

2
Розгляньте конвенції про базу даних, перше побачення має бути включеним. напр.check >= from && check < to
Онур Йылдирим

@Diode check: 23.02.2018 з: 20.11.2018 по: 31.12.2018 повертає істиною.
chudasamachirag

3
@chudasamachirag: Питання стосувалось аналізу формату dd / mm / yyyy. Ці дати вказані у форматі мм / дд / рррр
Діод

49

Замість порівняння дат безпосередньо порівняйте значення getTime () дати. Функція getTime () повертає кількість мілісекунд з 1 січня 1970 року як ціле число - повинна бути тривіальною, щоб визначити, чи потрапляє одне ціле число між двома іншими цілими числами.

Щось на зразок

if((check.getTime() <= to.getTime() && check.getTime() >= from.getTime()))      alert("date contained");

NaNні має GetTimeані getTimeметоду?
Бергі,

2
Це буде чудово працювати, коли формат дати такий - 05/05/2013, але коли дата у форматі iso (дата + час), як - 2019-09-12T13: 02: 14.291Z, тоді використовуйте метод setHours перед порівнянням дат, напр - let compareDate = new Date('checkDate').setHours(0, 0, 0, 0); let startDate = new Date('startDate').setHours(0, 0, 0, 0); let endDate = new Date('endDate').setHours(0, 0, 0, 0); console.log(compareDate <= endDate && compareDate >= startDate); Сподіваюся, це допоможе іншим :)
Sayan Samanta

17

Спробуйте те, що нижче. Це допоможе вам ...

Скрипка: http://jsfiddle.net/RYh7U/146/

Сценарій:

if(dateCheck("02/05/2013","02/09/2013","02/07/2013"))
    alert("Availed");
else
    alert("Not Availed");

function dateCheck(from,to,check) {

    var fDate,lDate,cDate;
    fDate = Date.parse(from);
    lDate = Date.parse(to);
    cDate = Date.parse(check);

    if((cDate <= lDate && cDate >= fDate)) {
        return true;
    }
    return false;
}

2
@Bergi: Якщо Дата, NANто ця функція return FalseОтже, Date you check Or Passє Not Availedабо In Validі це ПЕКЛО різниця між кодом мого та ним
Пандіан

Але OP-if-умова робить це теж? І мова йшла про дату істоти NaN в першу чергу (що це не у всіх браузерах)
Берги

Що робити , якщо я хотів , щоб перевірити, nowчи підпадає під 7:00amдо9:00pm
СІ8

dateCheck ("20.01.2015", "22/01/2015", "21/02/2015") ця справа не працює
Бхавін Рана,

@BhavinRana Цей випадок не працює, оскільки ви використовуєте дд / мм / рррр - правильним буде мм / дд / рррр
Майк

9

Відповідь, яка має 50 голосів, не перевіряє дату лише в місяцях. Ця відповідь не є правильною. Код нижче працює.

var dateFrom = "01/08/2017";
var dateTo = "01/10/2017";
var dateCheck = "05/09/2017";

var d1 = dateFrom.split("/");
var d2 = dateTo.split("/");
var c = dateCheck.split("/");

var from = new Date(d1);  // -1 because months are from 0 to 11
var to   = new Date(d2);
var check = new Date(c);

alert(check > from && check < to);

Це код, розміщений в іншій відповіді, і я змінив дати, і саме тому я помітив, що це не працює

var dateFrom = "02/05/2013";
var dateTo = "02/09/2013";
var dateCheck = "07/07/2013";

var d1 = dateFrom.split("/");
var d2 = dateTo.split("/");
var c = dateCheck.split("/");

var from = new Date(d1[2], parseInt(d1[1])-1, d1[0]);  // -1 because months are from 0 to 11
var to   = new Date(d2[2], parseInt(d2[1])-1, d2[0]);
var check = new Date(c[2], parseInt(c[1])-1, c[0]);


alert(check > from && check < to);

2

Я створив функцію налаштування для перевірки даної дати між двома датами чи ні.

var getvalidDate = function(d){ return new Date(d) }

function validateDateBetweenTwoDates(fromDate,toDate,givenDate){
    return getvalidDate(givenDate) <= getvalidDate(toDate) && getvalidDate(givenDate) >= getvalidDate(fromDate);
}

2

Спрощений спосіб зробити це на основі прийнятої відповіді.

У моєму випадку мені потрібно було перевірити, чи поточна дата (Сьогодні) відповідає діапазону двох інших дат, тому використовувався newDate () замість жорстко закодованих значень, але ви можете зрозуміти, як можна використовувати жорстко закодовані дати.


var currentDate = new Date().toJSON().slice(0,10);
var from = new Date('2020/01/01');
var to   = new Date('2020/01/31');
var check = new Date(currentDate);

console.log(check > from && check < to);


0

Спробуйте це:

HTML

<div id="eventCheck"></div>

ЯВАСКРИПТ

// ----------------------------------------------------//
// Todays date
var today = new Date();
var dd = today.getDate();
var mm = today.getMonth()+1; //January is 0!
var yyyy = today.getFullYear();

// Add Zero if it number is between 0-9
if(dd<10) {
    dd = '0'+dd;
}
if(mm<10) {
    mm = '0'+mm;
}

var today = yyyy + '' + mm + '' + dd ;


// ----------------------------------------------------//
// Day of event
var endDay = 15; // day 15
var endMonth = 01; // month 01 (January)
var endYear = 2017; // year 2017

// Add Zero if it number is between 0-9
if(endDay<10) {
    endDay = '0'+endDay;
} 
if(endMonth<10) {
    endMonth = '0'+endMonth;
}

// eventDay - date of the event
var eventDay = endYear + '/' + endMonth + '/' + endDay;
// ----------------------------------------------------//



// ----------------------------------------------------//
// check if eventDay has been or not
if ( eventDay < today ) {
    document.getElementById('eventCheck').innerHTML += 'Date has passed (event is over)';  // true
} else {
    document.getElementById('eventCheck').innerHTML += 'Date has not passed (upcoming event)'; // false
}

Скрипка: https://jsfiddle.net/zm75cq2a/


0

Ось метод прототипу дати, написаний машинописом:

Date.prototype.isBetween = isBetween;
interface Date { isBetween: typeof isBetween }
function isBetween(minDate: Date, maxDate: Date): boolean {
  if (!this.getTime) throw new Error('isBetween() was called on a non Date object');
  return !minDate ? true : this.getTime() >= minDate.getTime()
    && !maxDate ? true : this.getTime() <= maxDate.getTime();
};

0

Я зробив те саме, що @Diode, перша відповідь, але я поставив умову з діапазоном дат, сподіваюся, цей приклад буде корисним для когось

напр. (той самий код для прикладу з масивом дат)

var dateFrom = "02/06/2013";
var dateTo = "02/09/2013";

var d1 = dateFrom.split("/");
var d2 = dateTo.split("/");

var from = new Date(d1[2], parseInt(d1[1])-1, d1[0]);  // -1 because months are from 0 to 11
var to   = new Date(d2[2], parseInt(d2[1])-1, d2[0]); 



var dates= ["02/06/2013", "02/07/2013", "02/08/2013", "02/09/2013", "02/07/2013", "02/10/2013", "02/011/2013"];

dates.forEach(element => {
   let parts = element.split("/");
   let date= new Date(parts[2], parseInt(parts[1]) - 1, parts[0]);
        if (date >= from && date < to) {
           console.log('dates in range', date);
        }
})


0

Припустимо, наприклад, ваша дата настає так, і вам потрібно встановити momentjs для попередніх функцій дати.

let cmpDate = Thu Aug 27 2020 00:00:00 GMT+0530 (India Standard Time)

    let format = "MM/DD/YYYY";
    let startDate: any = moment().format(format);
    let endDate: any = moment().add(30, "days").format(format);
    let compareDate: any = moment(cmpDate).format(format);
    var startDate1 = startDate.split("/");
    var startDate2 = endDate.split("/");
    var compareDate1 = compareDate.split("/");

    var fromDate = new Date(startDate1[2], parseInt(startDate1[1]) - 1, startDate1[0]);
    var toDate = new Date(startDate2[2], parseInt(startDate2[1]) - 1, startDate2[0]);
    var checkDate = new Date(compareDate1[2], parseInt(compareDate1[1]) - 1, compareDate1[0]);

    if (checkDate > fromDate && checkDate < toDate) {
      ... condition works between current date to next 30 days
    }

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.