如何阻止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
相关产品推荐
相关产品推荐

