当Prisma查询MySQL数据库时出现8小时时间差,通常是由于以下原因之一:
修改你的prisma/schema.prisma
文件中的datasource配置:
datasource db {
provider = "mysql"
url = "mysql://user:password@localhost:3306/dbname?connection_limit=5&timezone=Asia/Shanghai"
}
将Asia/Shanghai
替换为你所在的时区(如Asia/Tokyo
、Europe/Paris
等)。
sql
SHOW VARIABLES LIKE '%time_zone%';
sql
SET GLOBAL time_zone = '+8:00';
或
sql
SET GLOBAL time_zone = 'Asia/Shanghai';
如果你无法修改数据库配置,可以在应用层处理:
// 查询后转换时区
const results = await prisma.yourModel.findMany();
const adjustedResults = results.map(item => ({
...item,
dateField: new Date(item.dateField.getTime() + 8 * 60 * 60 * 1000)
}));
const prisma = new PrismaClient();
prisma.$use(async (params, next) => {
const result = await next(params);
if (params.model && params.action === 'findMany') {
return result.map(item => {
if (item.dateField) {
return {
...item,
dateField: new Date(item.dateField.getTime() + 8 * 60 * 60 * 1000)
};
}
return item;
});
}
return result;
});
修改后,可以通过以下方式验证:
const test = await prisma.$queryRaw`SELECT NOW() as currentTime`;
console.log(test);
检查输出时间是否与当前本地时间一致。