Ваша проблема в том, что формат даты ГГГГ-ММ-ДД ЧЧ: мм не поддерживается ECMAScript, поэтому синтаксический анализ зависит от реализации.Safari, например:
new Date("2018-11-30 05:00")
возвращает недопустимую дату.
Вы можете сначала проанализировать строку вручную, либо с помощью специальной функции (например, Как проанализироватьстрока в объект даты в JavaScript? ) или в библиотеке, тогда вы можете сравнить результат с new Date()
как для Сравнить две даты с JavaScript .
Простая функция разбора не сложна:
/* Parse string in YYYY-MM-DD HH:mm:ss to a Date
* All parts after YYYY-MM are optional, milliseconds ignored
*/
function parseDate(s) {
var b = s.split(/\D/);
return new Date(b[0], b[1]-1, b[2]||1, b[3]||0, b[4]||0, b[5]||0);
}
["2018-11-23 17:23",
"2019-01",
"2020-12-31 23:59:59"].forEach(s => {
console.log(`${s} => ${parseDate(s).toString()}`);
});
Затем вы можете сравнить даты, используя <
, <=
, >
и >=
.
В этом случае дата, подобная "2018-01-01", будет считаться прошедшей в любое время после 2018-01-01 00: 00: 00.000.
В качестве альтернативы, поскольку строкапохож на формат ISO 8601, вы можете сравнить части строки с аналогично отформатированной строкой на сегодняшний день:
// Return date string in YYYY-MM-DD HH:mm:ss format
// Only return as many parts as len, or all 6 if missing
function formatDate(d, len) {
var parts = [d.getFullYear(), '-'+d.getMonth()+1, '-'+d.getDate(), ' '+d.getHours(), ':'+d.getMinutes(), ':'+d.getSeconds()];
var spacer = ['-','-',' ',':',':'];
len = len || 6;
return parts.splice(0, len).join('');
}
['2018-06-30 12:04',
'2018-10',
'2018-12-15 03:14:45',
'2019-01-01',
'2020-12-15 03:14:45'].forEach(s => {
console.log(`${s} has passed? ${s < formatDate(new Date(), s.split(/\D/).length)}`);
});
В этом случае 2018-01-01 будет равно любой дате, сгенерированной в этот день, а "2018-01" будет равно любой дате, сгенерированной в январе2018. Вам решать, используете ли вы <
или <=
для сравнения.
Поэтому вам нужно тщательно продумать, где вы рисуете границу между ранним и поздним, и соответствующим образом скорректировать логику.