【问题标题】:comparing date.toUTCString() using greater than ( > ) always returns false whether the other date is older or younger使用大于 ( > ) 比较 date.toUTCString() 总是返回 false,无论其他日期是否更早或更早
【发布时间】:2023-03-30 10:05:02
【问题描述】:

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

奇怪的是这段代码几天前运行良好,不知道从现在到那时发生了什么。

【问题讨论】:

    标签: javascript date compare utc


    【解决方案1】:

    由于比较运算符的两个操作数都是字符串,因此您正在进行字典比较。

    Date 实例的toUTCString 方法返回一个字符串,该字符串以一周中的三个字母开头(Sun、Mon、Tue、Wed、Thu、Fri 或 Sat)。

    假设今天是星期一。那么:

    • yesterday 是星期天,所以 yesterday.toUTCString() 会以 "Sun" 开头。
    • twoDaysAgo 是星期六,所以twoDaysAgo.toUTCString() 会以"Sat" 开头。
    • fiveDaysAgo 是星期三,所以 fiveDaysAgo.toUTCString() 会以 "Wed" 开头。

    在这种情况下,toUTCString 的结果恰好与日期本身的自然顺序具有相同的顺序(如 "Wed" &lt; "Sat" &lt; "Sun" 按字典顺序),因此比较结果正确是巧合。

    现在假设今天是星期二,并重复相同的论点。您会找到导致“奇怪”结果的原因。

    要正确比较日期,您应该使用getTime:

    twoDaysAgo.getTime() > yesterday.getTime(); // returns false
    twoDaysAgo.getTime() > fiveDaysAgo.getTime(); // returns true
    twoDaysAgo.getTime() < yesterday.getTime(); // returns true
    

    【讨论】:

    • 我认为 OP 应该只是比较 Date 对象本身而不是人类可读的字符串版本。你可以使用Date.prototype.getTime(),但是&lt;&gt;已经使用了valueOf()函数,所以真的没有区别。
    • 那么就没有办法比较UTC字符串本身了吗?真可惜,哈哈,这就是我将时间戳存储在我的 psql 数据库中的方式,所以我试图通过比较字符串来获取数据。
    猜你喜欢
    • 2014-04-20
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    相关资源
    最近更新 更多