You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vitest中设置(模拟)时区以保障测试结果确定性?

在Vitest中模拟时区的几种可行方案

1. 全局统一配置(推荐用于全项目测试)

直接在Vitest配置文件中设置TZ环境变量,让所有测试都使用指定时区,彻底避免环境差异。

修改vitest.config.ts(或.js):

import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    env: {
      // 这里可以设置任意合法时区,比如 'UTC'、'Asia/Shanghai'、'America/Los_Angeles'
      TZ: 'UTC'
    }
  }
})

不管本地机器或CI/CD的系统时区是什么,所有测试都会以你指定的时区运行,日期相关输出完全一致。

2. 单测试文件/用例动态设置

如果不同测试需要不同时区,可以在测试文件内临时修改环境变量,记得测试完成后恢复原时区,避免污染其他测试。

示例:

import { describe, it, expect, beforeAll, afterAll } from 'vitest'

// 保存原时区
const originalTZ = process.env.TZ

describe('时区敏感测试', () => {
  beforeAll(() => {
    // 设置测试用的时区
    process.env.TZ = 'Asia/Shanghai'
  })

  afterAll(() => {
    // 恢复原时区
    process.env.TZ = originalTZ
  })

  it('应该输出上海时区的日期', () => {
    const date = new Date('2024-01-01T00:00:00Z')
    // 上海时区比UTC+8,所以本地时间是2024-01-01 08:00:00
    expect(date.getHours()).toBe(8)
  })
})

3. 针对浏览器环境测试的补充

如果你的测试在jsdom环境下运行(默认浏览器模拟),TZ环境变量同样生效,上面的全局配置或动态设置方法都适用,无需额外配置。

注意事项

  • 对于Day.js、Luxon这类第三方日期库,大部分会自动读取TZ环境变量,但如果库本身有单独的时区配置,需要同步调整(比如Day.js的dayjs.tz.setDefault())。
  • 不要在测试中途随意修改时区,否则会导致同一测试文件内的用例互相干扰,一定要在beforeAll/afterAll或beforeEach/afterEach中做设置和恢复。

内容的提问来源于stack exchange,提问作者Chen Peleg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:03:17