技术问询: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
相关产品推荐
相关产品推荐

