当使用 Prisma 操作 MySQL 数据库时出现时间时区差异,通常由以下几个因素导致:
在 Prisma 连接字符串中明确指定时区:
datasource db {
provider = "mysql"
url = "mysql://user:password@localhost:3306/db?connection_limit=5&timezone=UTC"
}
或使用其他标准时区如 Asia/Shanghai
。
确保 MySQL 服务器时区设置一致:
-- 查看当前时区设置
SELECT @@global.time_zone, @@session.time_zone;
-- 设置为UTC时区
SET GLOBAL time_zone = '+00:00';
SET time_zone = '+00:00';
在 Prisma 模型中使用适当的日期时间类型:
model Event {
id Int @id @default(autoincrement())
createdAt DateTime @default(now()) @db.Timestamp(6)
updatedAt DateTime @updatedAt @db.Timestamp(6)
eventTime DateTime @db.Timestamp(6)
}
在应用代码中统一时区处理:
// 使用UTC时间处理
const utcDate = new Date().toISOString();
// 或者在查询时转换时区
const events = await prisma.$queryRaw`
SELECT id, CONVERT_TZ(eventTime, 'UTC', 'Asia/Shanghai') as localEventTime
FROM Event
`;
如果问题仍然存在,可以添加以下调试步骤:
通过以上方法,您应该能够解决 Prisma 操作 MySQL 时的时间时区差异问题。