如果当前日期和时间(之后)大于X

时间:2018-11-29 18:00:09

标签: javascript date internet-explorer

我正在尝试创建一个if语句,该语句可以检查今天的日期和时间,如果它大于预定义的日期和时间,请执行某些操作。我希望仅在普通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 :(得分:0)

在Firefox和Chrome上没有问题。在Internet Explorer上是错误的。

在IE(或一般而言)上,字符串必须为RFC2822 or ISO 8601 formatted date

示例:

new Date("2018-11-29T19:15:00.000Z")

答案 1 :(得分:0)

如果您需要便携式解决方案(例如,支持较旧的Internet Explorer),我会改用this constructor

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');

答案 2 :(得分:0)

您需要在日期后附加“ 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")
}

答案 3 :(得分:0)

您的问题是ECMAScript不支持日期格式YYYY-MM-DD HH:mm,因此解析取决于实现。 Safari,例如:

new Date("2018-11-30 05:00")

返回无效日期。

您可以首先使用定制功能(例如How to parse a string into a date object at JavaScript?)或库手动解析字符串,然后可以像Compare two dates with JavaScript一样将结果与new Date()进行比较。

简单的解析功能并不难:

/* 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年1月生成的任何日期。是否使用{{1 }}或<进行比较。

因此,您需要仔细考虑在较早和较晚之间绘制边界的位置,并相应地调整逻辑。