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

如何阻止Prisma ORM转换MySQL数据库UTC时间至应用时区?

解决Prisma查询MySQL时UTC时间被转换的问题

以下是几个可行的解决方法,按优先级尝试:

  • 给数据库连接字符串加上时区参数
    打开你的schema.prisma文件,确保数据库连接URL里明确指定UTC时区。以MySQL为例,连接字符串要追加&serverTimezone=UTC,示例:

    datasource db {
      provider = "mysql"
      url      = "mysql://username:password@localhost:3306/your_db?serverTimezone=UTC"
    }
    

    这一步是核心,很多时候时区转换问题都源于数据库连接时的时区不匹配,和应用层的TZ设置无关。

  • 修改Prisma模型的DateTime字段定义
    在模型的DateTime字段上添加@db.DateTime(0)注解,强制以UTC格式存储和读取时间,避免时区歧义:

    model Event {
      // ...其他字段
      dateStart             DateTime @map("datestart") @db.DateTime(0)
      dateEnd               DateTime @map("dateend") @db.DateTime(0)
      // ...其他字段
    }
    

    修改后记得重新生成Prisma客户端:npx prisma generate

  • 用数据库端的UTC时间做比较
    查询时直接调用MySQL的UTC_TIMESTAMP()函数获取数据库的当前UTC时间,和存储的时间做对比,完全绕开应用层的时间转换问题:

    const ongoingEvents = await prisma.event.findMany({
      where: {
        dateStart: { lte: prisma.raw('UTC_TIMESTAMP()') },
        dateEnd: { gte: prisma.raw('UTC_TIMESTAMP()') }
      }
    });
    
  • 检查MySQL服务器的全局时区
    登录MySQL终端,执行命令查看当前时区:

    SELECT @@global.time_zone, @@session.time_zone;
    

    如果结果不是UTC或+00:00,修改MySQL配置文件(比如my.cnf),添加:

    default-time-zone = '+00:00'
    

    重启MySQL服务后,所有新连接都会默认使用UTC时区。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:42:18