我正在尝试创建一个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()) {
答案 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 }}或<
进行比较。
因此,您需要仔细考虑在较早和较晚之间绘制边界的位置,并相应地调整逻辑。