Даты сравнения Javascript всегда ложны

У меня есть следующая функция в JS:

var startDate = stringToDate('12/01/2016','mm/dd/yyyy','/');
var endDate = stringToDate('01/01/2017','mm/dd/yyyy','/');


function compareDate(_date) {

  var val1 = ( startDate <= _date)
  var val2 = ( endDate >= _date )
  var val = val1 && val2

  log('--------')
  log(_date)
  log(startDate)
  log(endDate)
  log(val1)
  log(val2)
  log(val)
  log('--------')
  return val
}

ЖУРНАЛЫ

[17-02-10 13:25:14:145 EET] Пт, 02 декабря 2016 г., 00:00:00 GMT+0200 (EET)

[17-02-10 13:25:14:146 EET] Чт, 01 декабря, 00:00:00 GMT+02:00 2016

[17-02-10 13:25:14:147 EET] Вс, 01 января 00:00:00 GMT+02:00 2017

[17-02-10 13:25:14:147 EET] ложь

[17-02-10 13:25:14:148 EET] ложь

[17-02-10 13:25:14:148 EET] ложь

[17-02-10 13:25:14:149 EET] --------

[17-02-10 13:25:14:149 EET] --------

[17-02-10 13:25:14:150 EET] Сб, 03 декабря 2016 г., 00:00:00 GMT+0200 (EET)

[17-02-10 13:25:14:150 EET] Чт, 01 декабря, 00:00:00 GMT+02:00 2016

[17-02-10 13:25:14:151 EET] Вс, 01 января 00:00:00 GMT+02:00 2017

[17-02-10 13:25:14:151 EET] ложь

[17-02-10 13:25:14:152 EET] ложь

[17-02-10 13:25:14:152 EET] ложь

[17-02-10 13:25:14:152 EET] --------

[17-02-10 13:25:14:153 EET] --------

[17-02-10 13:25:14:153 EET] Вс, 04 декабря 2016 г., 00:00:00 GMT+0200 (EET)

[17-02-10 13:25:14:154 EET] Чт, 01 декабря, 00:00:00 GMT+02:00 2016

[17-02-10 13:25:14:154 EET] Вс, 01 января 00:00:00 GMT+02:00 2017

[17-02-10 13:25:14:155 EET] ложь

[17-02-10 13:25:14:155 EET] ложь

[17-02-10 13:25:14:156 EET] ложь

Как вы можете видеть в первом журнале, Dec 02 больше, чем Dec 01, но я получаю ложь и так далее...


person Bobj-C    schedule 10.02.2017    source источник
comment
Попробуйте Гугл. stackoverflow.com/questions/492994/   -  person Sangbok Lee    schedule 10.02.2017
comment
Какого типа _date? Я предполагаю, что это строка, поэтому вы сравниваете строковый примитив с объектом Date. См. Как создать минимальный, полный и проверяемый пример.   -  person RobG    schedule 10.02.2017
comment
Возможный дубликат Сравните две даты с помощью JavaScript   -  person evolutionxbox    schedule 10.02.2017
comment
Вы уверены, что вводите дату, а не строку в compareDate(), т.е. compareDate(new Date('01/01/2017'));   -  person Andre Nel    schedule 10.02.2017
comment
см. мою версию даты того, что вы делаете ниже (вторая часть моего ответа)...   -  person Andre Nel    schedule 10.02.2017


Ответы (1)


В вашем вопросе отсутствует некоторый код, но я добавил свою версию -> изменить строки строк на целые числа с форматом yyyymmdd и сравнить целые числа для >= и <= (поскольку сравнение строк может быть неправильным):

function stringToDateInt(_date, _format, _sep)
{
  var aDate = _date  .split(_sep);
  var aForm = _format.split(_sep);
  //console.log(aDate);
  //console.log(aForm);
  var oDate = {};
  for(var i = 0, length = aDate.length; i < length; i++)
  {
    oDate[aForm[i]] = aDate[i];
  }
  //console.log(oDate);
  return (oDate.yyyy + oDate.mm + oDate.dd) * 1;
}

var startDate = stringToDateInt('12/01/2016','mm/dd/yyyy','/');
var endDate   = stringToDateInt('01/01/2017','mm/dd/yyyy','/');

function compareDate(_date)
{
  var iDate = stringToDateInt(_date,'mm/dd/yyyy','/');
  var val1 = ( startDate <= iDate);
  var val2 = ( endDate >= iDate );
  var val = val1 && val2;

  console.log('--------')
  console.log(_date, '->', iDate);
  console.log(startDate)
  console.log(endDate)
  console.log('Date Bigger than or equal startDate:', val1)
  console.log('Date Less than or equal endDate:', val2)
  console.log('Date between start and end dates:', val)
  console.log('--------')
  return val
}

compareDate('12/02/2016');

compareDate('01/01/2015');

compareDate('11/11/2017');

Или версия даты ближе к тому, что вы делаете:

function stringToDate(_date, _format, _sep)
{
  var aDate = _date  .split(_sep);
  var aForm = _format.split(_sep);
  //console.log(aDate);
  //console.log(aForm);
  var oDate = {};
  for(var i = 0, length = aDate.length; i < length; i++)
  {
    oDate[aForm[i]] = aDate[i];
  }
  //console.log(oDate);
  //return (oDate.yyyy + oDate.mm + oDate.dd) * 1;
  return new Date(oDate.yyyy, (oDate.mm * 1 - 1), oDate.dd);
}

var startDate = stringToDate('12/01/2016','mm/dd/yyyy','/');
var endDate   = stringToDate('01/01/2017','mm/dd/yyyy','/');

function compareDate(_date)
{
  var val1 = ( startDate <= _date);
  var val2 = ( endDate >= _date );
  var val = val1 && val2;

  console.log('--------')
  console.log(_date, '->', _date);
  console.log(startDate)
  console.log(endDate)
  console.log('Date Bigger than or equal startDate:', val1)
  console.log('Date Less than or equal endDate:', val2)
  console.log('Date between start and end dates:', val)
  console.log('--------')
  return val
}

compareDate(stringToDate('12/02/2016','mm/dd/yyyy','/'));

compareDate(stringToDate('01/01/2015','mm/dd/yyyy','/'));

compareDate(stringToDate('11/11/2017','mm/dd/yyyy','/'));

person Andre Nel    schedule 10.02.2017
comment
Вы сделали несколько смелых предположений, но OP не раскрыл, как вызывается функция или что делает stringToDate. Сравнение yyyymmdd должно работать, будь то строка или число. Кстати, в вашем stringToDate oDate.mm должно быть oDate.mm - 1. ;-) - person RobG; 10.02.2017