我在写一个 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
}
数据库本身是不会保存时区信息的,所以数据库保存的时间需要约定好,是 UTC 还是某个地方的本地时间。一般情况下,建议保存 UTC 时间,方便转换。
接下来就是存取的时候,存之前一定要把本地时间转换成 UTC 时间再来存。而取的时候,也需要进行逆向转换。一般我们会在服务端做这个事情,由于服务端本身可能为多个地区的用户服务,所以服务端一般也建议使用 UTC 时间。
然后是在浏览器端,浏览器端因为直接面向用户,默认都是按本地时间来用的。所以从浏览器传数据到服务端的时候,需要在服务端判断这个时间到底是哪个时区的,然后再处理成 UTC 时间。而多数情况下非用户指定时使用的当前时间,这个过程可以替换成取服务器当前时间
参阅:考虑时区了吗?