Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript-如何模拟时区?_Javascript_Mocking_Timezone - Fatal编程技术网

javascript-如何模拟时区?

javascript-如何模拟时区?,javascript,mocking,timezone,Javascript,Mocking,Timezone,我有一个函数,可以计算给定时间戳解析为用户本地时区上的哪个日期(YYYY-MM-DD)。例如:2019-12-31T23:30:00.000Z在UTC+1上解析为2020-01-01,但在UTC-1上解析为2019-12-31 这是我的实现: function calcLocalYyyyMmDd(dateStr) { const date = new Date(dateStr); const year = String(date.getFullYear()).padStart(4, "0

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

这是我的实现:

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}`;
}
这正如预期的那样工作,但是,我想在单元测试中验证这种行为(使用jest,不确定是否相关)

如何模拟本地时区?

不幸的是,有

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


注意到,由于时区实现的复杂性,这种方法在Windows上是不可靠的。

< P>如果您编写的是代码> JEST 测试或类似,请考虑使用以在至少两个时区中测试代码。

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");
  });
});