Prisma时区问题

770 阅读1分钟

prisma项目初始化

mkdir prisma-test
cd prisma-test
npm init -y

安装对应依赖

npm i -D typescript ts-node @types/node

typescript 初始化

npx tsc --init

安装prisma

npm i prisma

编写代码

初始化prisma

//指定初始化mysql数据库
prisma init --datasource-provider mysql
// schema.prisma 定义一个 schema 模型 user
model User {
  id         Int      @id @default(autoincrement())
  name       String
  createTime DateTime @default(now())
  updateTime DateTime @updatedAt
}

生成 Prisma Client 代码

prisma migrate dev --name 0
prisma generate

在 src/index.ts 创建一条数据库数据

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  const user = await prisma.user.create({
      data: {
        name: 'yyqy',
  })
}

main()

// 终端运行代码
npx ts-node ./src/index.ts

image.png 可以看到数据库中这一条记录的 createTimeupdateTime 字段生成的时间都是 UTC 格式 开始我以为是mysql数据库时区的问题,一顿排查发现和 mysql 没有任何关系,而是prisma默认采用 UTC 时区
Improve Timezone Support for Existing MySQL Databases configured with a Non-UTC Timezone · Issue #5051 · prisma/prisma (github.com)

prisma 同步成mysql系统时区(Asia/Shanghai)

// 我们采用SQL写法把 createTim 和 updateTime 改成 mysql 时区时间戳
createTime DateTime @default(dbgenerated("NOW()")) @db.DateTime
updateTime DateTime @default(dbgenerated("NOW() ON UPDATE NOW()")) @db.Timestamp(0)

image.png