【问题标题】:Problem with Date timestamp on JavascriptJavascript上的日期时间戳问题
【发布时间】:2021-11-10 07:29:24
【问题描述】:

我有一个将日期设置为 UTC 0 的函数。像这样:

const removeDateTimestamp = (date) => {
    return new Date(
        date.getUTCFullYear(),
        date.getUTCMonth(),
        date.getUTCDate(),
        0,
        0,
        0,
        0
    );
};

但问题在于我使用它的时候。如果我在浏览器的控制台上使用,我会得到以下结果:

2021 年 5 月 15 日星期六 00:00:00 GMT+0200 (hora de verano de Europa central)

但是当我在 Jest 上运行测试时,我得到了另一个结果:

Received has type:  date
Received has value: 2021-05-14T22:00:00.000Z

it("removeDateTimestamp", () => {
expect(removeDateTimestamp(new Date(2021, 4, 16))).toMatch(
    /2021-05-16T00:00:00.000Z/i
  );
});

在第一个示例中,我在 2021 年 5 月 15 日星期六 00:00:00 GMT+0200 度过了 16 天,而在第二个示例中,同一天是 14。

我明显忽略了一些重要的东西,但我没有看到它。

【问题讨论】:

  • 顺便说一句,当从年、月等值构造日期时,缺失值被视为零(或 1 表示当天),因此 new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate() 将复制日期,并将时间部分设置为零。 :-)

标签: javascript node.js date jestjs timestamp


【解决方案1】:

Date 构造函数以本地 时间解释其参数。要使用 UTC 从部件中获取 Date 实例,请使用 Date.UTC (它返回一个毫秒以来的纪元值,因此如果您想要一个 Date 实例,请将结果传递给 new Date):

const removeDateTimestamp = (date) => {
    return new Date(
        Date.UTC(
            date.getUTCFullYear(),
            date.getUTCMonth(),
            date.getUTCDate(),
            0,
            0,
            0,
            0
        )
    );
};

FWIW,这里有另一种方法来做你在上面做的同样的事情:

const removeDateTimestamp = (date) => {
    const newDate = new Date(+date); // Clone the date -- the `+` is important
                                     // on some JavaScript engines
    newDate.setUTCHours(0, 0, 0, 0);
    return newDate;
};

我还应该提到,new Temporal API 有一种方法可以做到这一点,它很快就会进入标准库(已经在第 3 阶段)。

【讨论】:

  • 姗姗来迟(叹息) 我意识到必须是一个欺骗目标。我没有立即找到它(例如,this),但它似乎真的很可能在那里。我必须回去工作(甚至发布这个答案都很顽皮)。如果有人找到它,请@我,以便我可以删除上面的内容。 Enric,请不要在一天左右的时间内接受上面的答案,以防我是对的,有一个预先存在的问题/答案。
【解决方案2】:

T.J.有详细的答案,但我找不到合适的副本,所以我将其发布为简化以解决您的问题。

由于 ECMAScript 天数总是正好 8.64e7 毫秒,因此您可以在一天内减去除以毫秒后的余数,例如

const getUTCTimeZero = (date) => new Date(date - date % 8.64e7);

console.log(getUTCTimeZero(new Date()))

名称 removeDateTimestamp 有点误导,因为时间戳是表示日期或时间的任何字符串或数字(或可能值)。您似乎只想将时间设置为零,因此名称不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多