如何使用Sequelize.fn函数获取IST时区时间?
解决思路
核心原因
sequelize.fn("NOW") 是直接调用数据库原生的NOW()函数,其返回时间由数据库服务器的时区配置决定,和Sequelize初始化时设置的useUTC: false、timezone: '+5:30'无关——这些配置只影响Sequelize对模型字段的时间解析/格式化,不干预数据库原生函数的执行结果。
具体解决方案
修改数据库时区配置
直接让数据库的NOW()返回IST时间,以MySQL为例:- 临时生效:执行SQL命令
SET GLOBAL time_zone = '+05:30';(需管理员权限),仅当前会话生效用SET time_zone = '+05:30'; - 永久生效:修改数据库配置文件(如my.cnf),添加
default-time-zone='+05:30'后重启服务
- 临时生效:执行SQL命令
在查询中手动转换时区
不依赖数据库时区,直接在SQL层面转换UTC时间到IST,用sequelize.literal替代fn("NOW"):sequelize.literal("CONVERT_TZ(NOW(), 'UTC', '+05:30')")不同数据库的转换函数有差异,比如PostgreSQL可写为
NOW() AT TIME ZONE 'UTC' AT TIME ZONE 'Asia/Kolkata'改用Sequelize客户端生成的时间
如果允许使用客户端时间,直接用new Date(),此时Sequelize的时区配置会生效,自动将客户端时间转换为配置的IST时区存入数据库:// 示例:更新语句中使用 model.update({ updatedAt: new Date() }, { where: { id: 1 } })验证Sequelize配置结构
确认初始化配置的写法正确,以MySQL为例,正确的配置结构应为:const sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'mysql', useUTC: false, timezone: '+05:30' });
内容的提问来源于stack exchange,提问作者Sakshi
相关产品推荐
相关产品推荐

