javascript - 如何模拟时区?

nag*_*hun 5 javascript timezone mocking

我有一个函数可以计算给定时间戳解析为用户本地时区的哪个日期 (YYYY-MM-DD)。例如:2019-12-31T23:30:00.000Z解析为2020-01-01on UTC+1,但解析为2019-12-31on UTC-1

这是我的实现:

function calcLocalYyyyMmDd(dateStr) {
  const date = new Date(dateStr);
  const year = String(date.getFullYear()).padStart(4, "0");
  const month = String(date.getMonth() + 1).padStart(2, "0");
  const day = String(date.getDate()).padStart(2, "0");
  return `${year}-${month}-${day}`;
}
Run Code Online (Sandbox Code Playgroud)

这按预期工作,但是,我想在单元测试中验证这种行为(使用玩笑,不确定是否相关)。

describe("calcLocalYyyyMmDd", () => {
  test("calculates correct date on UTC+1", () => {
    // TODO mock local timezone
    const result = calcLocalYyyyMmDd("2019-12-31T23:30:00.000Z");
    expect(result).toBe("2020-01-01");
  });

  test("calculates correct date on UTC-1", () => {
    // TODO mock local timezone
    const result = calcLocalYyyyMmDd("2020-01-01T00:30:00.000Z");
    expect(result).toBe("2019-12-31");
  });
});
Run Code Online (Sandbox Code Playgroud)

如何模拟本地时区?

Mat*_*int 9

不幸的是,没有简单的方法可以做到这一点

但是,如果您使用的是 Linux 系统,则可以在启动浏览器启动 Node.jsTZ之前设置环境变量,但一旦进程运行,时区就无法更改。该对象仅使用系统的本地时区。Date

请注意,由于时区实现的复杂性,此方法在 Windows 上并不可靠。


Sim*_* B. 6

如果您正在编写jest测试或类似测试,请考虑使用https://www.npmjs.com/package/timezone-mock来至少在两个时区中测试您的代码。