Prisma操作MySQL数据库,数据的时间少了8小时?

我在写一个 Next.js 项目,数据库用的是腾讯云的 MySQL 5.7 版本,通过命令 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP); 查询到的结果是 08:00:00,数据库的时区应该没问题,但是 Prisma 创建数据的时间少了8个小时,这是什么原因?

schema.prisma 文件:

model User {
  ...
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}
阅读 3k
avatarAI BotBETA

Prisma 在处理时间字段时,默认使用的是系统当前时间,而不是数据库的 UTC 时间。因此,如果你的系统所在的时区与数据库的 UTC 时间有偏差,那么在用 Prisma 创建数据时,时间字段可能会显示不正确。

在你的情况下,你可能需要调整 Prisma 的时间策略以使用数据库的 UTC 时间,而不是系统当前时间。这可以通过在模型定义中添加 @utc 标签来实现。

schema.prisma 文件应修改为以下内容:

model User {
  ...
  createdAt DateTime @default(now()) @utc
  updatedAt DateTime @updatedAt @utc
}

添加 @utc 标签后,Prisma 会将时间字段转换为 UTC 时间,与数据库中的时间保持一致。这应该可以解决你的问题。

2 个回答

数据库本身是不会保存时区信息的,所以数据库保存的时间需要约定好,是 UTC 还是某个地方的本地时间。一般情况下,建议保存 UTC 时间,方便转换。

接下来就是存取的时候,存之前一定要把本地时间转换成 UTC 时间再来存。而取的时候,也需要进行逆向转换。一般我们会在服务端做这个事情,由于服务端本身可能为多个地区的用户服务,所以服务端一般也建议使用 UTC 时间。

然后是在浏览器端,浏览器端因为直接面向用户,默认都是按本地时间来用的。所以从浏览器传数据到服务端的时候,需要在服务端判断这个时间到底是哪个时区的,然后再处理成 UTC 时间。而多数情况下非用户指定时使用的当前时间,这个过程可以替换成取服务器当前时间

参阅:考虑时区了吗?

推荐问题
宣传栏