使用大于 ( > ) 比较 date.toUTCString() 总是返回 false 无论另一个日期是旧的还是新的

问题描述

我正在尝试使用时间戳从我的数据库获取不到 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