【问题标题】:Moment JS - UTC to Local timestamp fails comparisonMoment JS - UTC 到本地时间戳的比较失败
【发布时间】:2026-01-21 20:05:01
【问题描述】:

将 UTC 日期格式转换为时间戳时,此条件将始终失败

const start_time = "2017-03-02T15:57:00Z";
const stop_time = "2017-03-02T17:51:00Z";
const local_timestamp = 1488498242256; // Thu Mar 02 2017 16:44:02 GMT-0700 (MST)

const start = moment(start_time).valueOf(); // 1488470220000
const stop = moment(stop_time).valueOf(); // 1488477060000

const is_between = local_timestamp >= start && local_timestamp <= stop; // false

所以我尝试了这个,但仍然失败

const start = moment(start_time).utc().valueOf(); // 1488470220000
const stop = moment(stop_time).utc().valueOf(); // 1488477060000
const is_between = local_timestamp >= start && local_timestamp <= stop; // false

同样的事情

const now = moment(local_timestamp);
const isBetween =  now.isBetween(start, stop); // false

请帮助我理解这一点。

【问题讨论】:

    标签: javascript date timestamp momentjs utc


    【解决方案1】:

    如果 start 和 end 是 UTC 时间,则使用 moment.utc(start_time)moment.utc(stop_time)

    但是将 UTC 日期与本地日期进行比较似乎不合逻辑。这就是你正在尝试的样子。

    【讨论】:

    • 您是对的,将 UTC 时间与当地时间进行比较是不合逻辑的。在 htis 的情况下,我从后端得到了不同的结果。发生的事情是后端服务无法给我UTC时间戳,所以它会回退到机器本地时间。再次感谢您的回复
    • 是的,约会总是很痛苦。在这种情况下,您也可以尝试使用moment timezone 以更轻松地进行转换。
    【解决方案2】:

    将 UTC 日期格式转换为时间戳时,此条件将始终失败

    timestamp 是表示日期或时间的任何内容,因此“2017-03-02T15:57:00Z”、“Thu Mar 02 2017 16:44:02 GMT-0700 (MST)”和 1488498242256 都是时间戳。

    1488498242256 代表“2017-03-02T23:44:02.256Z”,它不在“2017-03-02T15:57:00Z”和“2017-03-02T17:51:00Z”之间,所以预期结果为你的测试是假的。

    所以我尝试了这个,但仍然失败

    它没有失败,它正在返回预期的结果。

    当你这样做时,说:

    new Date(1488498242256)
    

    然后创建一个 Date 实例,其时间值为 1488498242256,表示“2017-03-02T23:44:02.256Z”。当您将其写入生成字符串的输出时,通常会调用 Date.prototype.toString 并以浏览器开发人员确定的人类友好格式生成字符串。

    通常这意味着主机系统时区偏移量用于生成字符串,您会看到如下内容:

    "Thu Mar 02 2017 16:44:02 GMT-0700 (MST)"
    

    在 SO 上,控制台似乎使用 toISOString 而不是默认的 toString,例如

    var date = new Date(1488498242256);
    
    // Standard output for the host environment
    console.log(date);
    
    // Call Date.prototype.toString specifically
    console.log(date.toString());

    【讨论】:

    • 感谢您的回复。我知道什么是时间戳:D 我最终通过使用 moment.utc(local_timestamp) 将本地时间戳转换为 UTC 偏移时间戳来解决此问题,但是,谢谢您的时间。希望您的回复对许多开发者有用