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

如何使用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层面转换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:15:31