javascript - как смоделировать часовой пояс? - PullRequest
2 голосов
/ 17 января 2020

У меня есть функция, которая вычисляет, к какой дате (ГГГГ-ММ-ДД) данная временная метка разрешает местный часовой пояс пользователя. Например: 2019-12-31T23:30:00.000Z разрешается в 2020-01-01 в UTC+1, но разрешается в 2019-12-31 в 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}`;
}

Это работает, как и ожидалось Тем не менее, я хотел бы проверить это поведение в модульном тесте (используя шутку, не уверен, если уместно).

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

Как я могу издеваться над местным часовым поясом?

1 Ответ

0 голосов
/ 17 января 2020

К сожалению, не существует простого способа сделать это .

Однако, если вы работаете в системе Linux, вы можете установить переменную окружения TZ до запуск браузера или запуск Node.js, но после запуска процесса часовой пояс изменить нельзя. Объект Date использует только локальный часовой пояс системы.

Обратите внимание, что этот подход ненадежен на Windows из-за сложностей реализации часового пояса.

...