问题描述
我正在尝试使用时间戳从我的数据库中获取不到 2 天的数据,但是在尝试比较两个日期时,2 天前的日期总是返回 false,无论它是与较旧的日期还是比较的日期年轻的日期。
let twoDaysAgo = new Date(Date.Now() - 2 * 24 * 60 * 60 * 1000);
let yesterday = new Date(Date.Now() - 1 * 24 * 60 * 60 * 1000);
let fiveDaysAgo = new Date(Date.Now() - 5 * 24 * 60 * 60 * 1000);
console.log(twoDaysAgo.toUTCString() > yesterday.toUTCString()); // returns false
console.log(twoDaysAgo.toUTCString() > fiveDaysAgo.toUTCString()); // also returns false
console.log(twoDaysAgo.toUTCString() < yesterday.toUTCString()); // of course returns true instead
奇怪的是,这段代码几天前还可以正常工作,不知道从现在到那时发生了什么。
解决方法
由于比较运算符的两个操作数都是字符串,因此您正在进行字典比较。
Date 实例的 toUTCString
方法返回一个字符串,该字符串以一周中的三个字母开头(Sun、Mon、Tue、Wed、Thu、Fri 或 Sat)。
假设今天是星期一。然后:
-
yesterday
将是星期日,因此yesterday.toUTCString()
将以"Sun"
开头。 -
twoDaysAgo
是星期六,所以twoDaysAgo.toUTCString()
将以"Sat"
开头。 -
fiveDaysAgo
将是星期三,因此fiveDaysAgo.toUTCString()
将以"Wed"
开头。
在这种情况下,toUTCString
的结果恰好与日期本身的自然顺序具有相同的顺序(如字典顺序中的 "Wed" < "Sat" < "Sun"
),因此巧合的是比较是正确的。
现在假设今天是星期二,然后重复相同的论点。你会找到你得到的“奇怪”结果的原因。
要正确比较日期,您应该使用 getTime
:
twoDaysAgo.getTime() > yesterday.getTime(); // returns false
twoDaysAgo.getTime() > fiveDaysAgo.getTime(); // returns true
twoDaysAgo.getTime() < yesterday.getTime(); // returns true