使用Prisma查詢MySQL數據庫時,發現創建數據的時間少了8小時。該現象可能是由于數據庫時區設置與程序的時區處理方式不一致造成的。
原因分析
MySQL數據庫本身并不存儲時區信息,它保存的時間是UTC時間。而Prisma會根據操作系統的時區設置來格式化時間。如果操作系統時區設置為東八區,而數據庫設置為UTC時間,則Prisma會將UTC時間減去8小時,以顯示東八區的本地時間。
解決方案
要解決此問題,需要在程序中明確指定時區,并確保與數據庫時區一致。建議采用以下步驟:
- 設置數據庫時區:在創建數據庫時,使用 SET TIMEZONE 語句明確設置其時區為UTC。示例:SET TIMEZONE=’+00:00′.
- 設置Prisma時區:在Prisma配置中,使用 schema.prisma 文件設置prisma的時區為UTC 。示例:`datasource db {
provider = “mysql“
url = “mysql://…”
# 設置時區為UTC
# 時區與您的數據庫時區一致
# 指南:https://www.prisma.io/docs/reference/prisma-schema/model-field-date-time#datetime-timezones
useDateTimeDefaultZone = “UTC”
}` - 在程序中轉換時間:在將時間數據存儲到數據庫之前,將其轉換為UTC時間。在從數據庫中獲取時間數據時,將其轉換為程序的時區。
參考
- 考慮時區了嗎?:https://www.praetorian.com/blog/did-you-consider-time-zones