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