Node process.timezone未设置:Jest测试中process.env.TZ设置不生效
Hey,我懂你这个问题!在Jest里设置process.env.TZ = 'UTC'之后,Date对象还是顽固地用着欧洲/柏林时区,对吧?这其实是因为Node.js在进程启动的时候就会读取并缓存时区配置,你在测试用例里才设置TZ,已经太晚啦——Jest的测试上下文可能在你设置环境变量之前就已经初始化了时区相关的逻辑。
给你几个靠谱的解决办法:
方案1:全局配置Jest时区(最推荐)
直接在Jest的配置文件里全局设置UTC时区,这样所有测试都会默认用这个时区,省得每个测试都折腾:
打开你的jest.config.js(如果是TS就是jest.config.ts),在最顶部加一行:
process.env.TZ = 'UTC'; module.exports = { // 这里放你原本的Jest配置,比如testMatch、moduleFileExtensions之类的 };
或者你也可以用Jest的setupFiles配置,专门写个初始化文件来设置时区,效果是一样的。
方案2:单个测试里强制刷新时区
如果你只需要某几个测试切换时区,可以先清掉Node.js的时区缓存,再设置环境变量:
describe('Timezones', () => { it('should always be UTC', () => { // 删掉Node缓存的时区相关模块 Object.keys(require.cache).forEach(key => { if (key.includes('tzdata') || key.includes('internal/timezone')) { delete require.cache[key]; } }); // 重新设置时区 process.env.TZ = 'UTC'; // 现在创建的Date就会用UTC啦 const d = new Date(); expect(d.getTimezoneOffset()).toBe(0); }); });
不过这种方法有点hack,能不用就不用,全局配置更省心。
顺便说下普通Node进程的情况
要是在普通Node脚本里,只要你在创建任何Date对象之前设置process.env.TZ = 'UTC',是能生效的。但如果进程已经创建过Date实例了,后续改TZ只会影响新创建的Date——要是还不行,同样可以试试清掉时区相关的缓存~
内容的提问来源于stack exchange,提问作者Oliver Watkins




