Prisma存储MySQL Time字段时区偏差问题求助
问题原因
你遇到的时间偏移问题核心在于Prisma对DateTime类型的时区处理逻辑,以及当前用Date对象传递时间的方式:
- Prisma模型里用
DateTime? @db.Time(0)映射MySQL的time字段,但Prisma会把JS的Date对象默认转换为UTC时间再写入数据库。 - 你用
new Date()创建的是本地时区的时间(假设服务器时区为UTC+1),设置为10:20后,对应的UTC时间就是9:20,最终写入MySQLtime字段的就是这个UTC时分秒值。 - MySQL的
time类型本身不带时区信息,只会原样存储传入的时分秒,因此出现存入10:20实际变成9:20的情况。
解决方法
方法1:直接传入时间字符串(推荐)
既然MySQL的time字段仅需时分秒,直接传递符合格式的时间字符串给Prisma,跳过Date对象的时区转换:
// 直接用字符串传入目标时间,无需创建Date对象 const currentHour = "10:20:00";
Prisma会直接将该字符串写入MySQL的time字段,不会做任何时区转换。
方法2:手动构建UTC时间匹配目标时分秒
如果必须使用Date对象,需要将目标时间设置为UTC时区的10:20,这样Prisma转UTC后写入的就是10:20:
const currentHour = new Date(Date.UTC(0, 0, 0, 10, 20, 0));
这种方式创建的Date对象,其UTC时分秒就是10:20,写入数据库后能得到正确值。
方法3:调整Prisma模型字段类型(可选)
如果业务仅需存储时分秒,可将Prisma模型的字段类型改为String,映射到MySQL的time类型:
init_hour String? @db.Time(0)
之后同样传入"10:20:00"格式的字符串即可。
内容的提问来源于stack exchange,提问作者Composedof2
相关产品推荐
相关产品推荐

