javascript - javascript - 如何模拟时区?
问题描述
我有一个函数可以计算给定时间戳在用户本地时区上解析为哪个日期(YYYY-MM-DD)。例如:2019-12-31T23:30:00.000Z
解析为2020-01-01
on UTC+1
,但解析为2019-12-31
on 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");
});
});
如何模拟本地时区?
解决方案
不幸的是,没有简单的方法可以做到这一点。
但是,如果您在 Linux 系统上,您可以在启动浏览器或启动 Node.jsTZ
之前设置环境变量,但是一旦进程运行,时区就无法更改。该对象仅使用系统的本地时区。Date
请注意,由于时区实现的复杂性,这种方法在 Windows 上并不可靠。
推荐阅读
- bash - 如何在bash中删除具有不同长度的字符串的最后一部分
- html - 以角度删除行
- c# - 无法从父视图模型 WPF MVVM 应用程序的弹出窗口中获取值
- c# - 在控制台应用程序中的另一个按键后检查按键(GetAsyncKeyState C#)
- angular - Angular ng test cause error if I have types "node" in compiler option
- reporting-services - SSRS 如何访问表达式中的共享数据集值
- wordpress - 如果当前用户不是管理员,请删除媒体库按钮 - Wordpress
- python - Memoization 无法正常工作,来自 MIT 开放课件“计算机科学与编程导论”第 21 课的 python 代码
- javascript - 从位置 0 javascript 的内部对象获取值
- postgresql - PostgreSQL - pgAdmin 4 - COPY 命令不适用于 Schema