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

技术问询:Asia/Almaty时区2024年2月29日调至GMT+5,Dayjs库未更新

Asia/Almaty时区调整引发的时间偏差问题(GMT+6→GMT+5)

问题现状

没错,不少开发者最近都碰到了这个情况:2024年2月29日起,Asia/Almaty时区的偏移从GMT+6改成了GMT+5,但包括Dayjs在内的主流日期库还没同步这个变更,导致时间计算出现1小时偏差。

针对Dayjs的临时解决方案

1. 手动覆盖时区偏移规则

不用等官方更新,直接在代码里自定义Asia/Almaty的时区规则,区分调整前后的偏移值:

import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'

dayjs.extend(utc)
dayjs.extend(timezone)

// 自定义修正后的Asia/Almaty时区
const fixedAlmaty = {
  name: 'Asia/Almaty',
  offset: (date) => {
    const cutoffDate = new Date('2024-02-29T00:00:00Z')
    // 2024-02-29及以后返回GMT+5(对应UTC+5,即300分钟偏移),之前返回GMT+6(360分钟)
    return date >= cutoffDate ? 300 : 360
  },
  abbr: () => 'ALMT' // 时区缩写不变
}

// 注册自定义时区
dayjs.tz.add([fixedAlmaty])

// 使用示例
const currentAlmatyTime = dayjs.tz('Asia/Almaty')
console.log(currentAlmatyTime.format('YYYY-MM-DD HH:mm:ss'))

2. 直接基于UTC手动计算

如果业务逻辑不复杂,也可以绕过时区插件,直接用UTC时间手动转换:

const getAlmatyTime = () => {
  const utcNow = new Date()
  const cutoff = new Date('2024-02-29T00:00:00Z')
  const offsetHours = utcNow >= cutoff ? 5 : 6
  return new Date(utcNow.getTime() + offsetHours * 60 * 60 * 1000)
}

// 调用示例
console.log(getAlmatyTime())

3. 更新时区数据源

Dayjs的时区数据来自dayjs-timezone包,底层依赖IANA时区数据库。你可以手动替换最新的时区数据:

  • 提取IANA最新tzdata文件中Asia/Almaty的规则
  • 替换项目中dayjs-timezone包对应的时区数据文件
  • 重新构建项目即可生效

后续建议

  • 盯紧Dayjs官方仓库,一旦dayjs-timezone发布包含该时区更新的版本,直接升级依赖就行
  • 其他日期库(比如Moment.js、Luxon)也存在同样问题,解决方案逻辑类似:要么手动覆盖偏移,要么更新时区数据

内容的提问来源于stack exchange,提问作者Deepak Sarvepalli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 20:51:13