Если текущая дата и время больше (после), чем X - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь создать оператор if, который может проверить сегодняшнюю дату и время, и если он больше, чем предопределенная дата и время, что-то сделать.Я пытаюсь сделать это только в vanilla JS и заставить его работать в IE.

Это основной рабочий код для Chrome.

var ToDate = new Date()

if (new Date("2018-11-30 05:00").getTime() > ToDate.getTime()) {
  alert("true")
} else {
  alert("false")
}

Как мне сделать что-то подобноеработать в IE?

if (new Date("2018-11-30 05:00").getTime() > ToDate.getTime()) {

Ответы [ 4 ]

0 голосов
/ 30 ноября 2018

Ваша проблема в том, что формат даты ГГГГ-ММ-ДД ЧЧ: мм не поддерживается 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. Вам решать, используете ли вы < или <= для сравнения.

Поэтому вам нужно тщательно продумать, где вы рисуете границу между ранним и поздним, и соответствующим образом скорректировать логику.

0 голосов
/ 29 ноября 2018

Если вам нужно переносимое решение (например, поддержка более старого Internet Explorer), я бы использовал этот конструктор вместо:

new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);

Имейте в виду, что monthIndex начинается с 0 (январь).

Тест:

function assertTrue(exp, message) {
   if (exp === false) {
     message = message || 'Assertion failed';
     alert(message);
     throw message;
   }
}

function testShouldPassForDatesInTheFuture() {
    var ToDate = new Date(2018, 10, 29);
    assertTrue(new Date(2018, 10, 30).getTime() > ToDate.getTime());
}

function testShouldPassForDatesInThePast() {
    var ToDate = new Date(2018, 10, 29);
    assertTrue(new Date(2018, 10, 28).getTime() < ToDate.getTime());
}

testShouldPassForDatesInThePast();
testShouldPassForDatesInThePast();
alert('All test passed');
0 голосов
/ 30 ноября 2018

Вам необходимо добавить 'T00: 00: 00.000Z' к вашей дате.

new Date("2018-11-30" + 'T00:00:00.000Z')

Полный код указан ниже:

var ToDate = new Date()

if (new Date("2018-11-30" + 'T00:00:00.000Z').getTime() > ToDate.getTime()) {
  alert("true")
} else {
  alert("false")
}
0 голосов
/ 29 ноября 2018

На Firefox и Chrome проблем с этим нет.В Internet Explorer это неверно.

В IE (или в целом) строка должна быть в формате RFC2822 или ISO 8601

Пример:

new Date("2018-11-29T19:15:00.000Z")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...