Z这是啥呀 2025-06-01 15:54 采纳率: 16.7%
浏览 89

nodejs prisma mysql 时区问题

nodeJs 时间问题,默认国际时区,导致我存放的数据也少了8小时

我的时间本来已经是6月1号了的,但是存到数据库里面就少了8小时,

img

一开始以为数据库时区有问题,但是我直接把prisma 的这个字段的默认填充时间设置为6月1 号的时候,发现他又是可以正常显示为6.1

img

##后面我就打印 new Date的时间,发现他输出的是国际时间

img

我现在猜测的就是,prisma 在处理时间格式的数据时就把他按照国际时间去转成字符串了,然后存到了数据库

img

导致我现在用当前时间的话就会少8小时,然后prisma数据库模型的默认时间也是会这样

img

现在我已经不知道要怎么搞了,请求各位帮忙

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-06-01 15:54
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    你遇到的问题是由于 Node.js 和 MySQL 的时区设置不一致导致的。Node.js 使用的是 UTC 时间,而 MySQL 使用的是服务器的时区。

    解决方案是:

    1. 在 Node.js 中使用 moment-timezone 库将时间转换为 UTC 时间,然后将其存储到数据库中。
    2. 在 MySQL 中使用 TIMESTAMP 类型存储时间,可以自动将时间转换为服务器的时区。

    示例代码:

    const moment = require('moment-timezone');
    const prisma = require('prisma');
    
    // 将时间转换为 UTC 时间
    const utcTime = moment.tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss');
    
    // 将 UTC 时间存储到数据库中
    prisma.user.create({
      data: {
        createdAt: utcTime,
      },
    });
    

    在上面的代码中,我们使用 moment-timezone 库将时间转换为 UTC 时间,然后将其存储到数据库中。这样可以确保时间的准确性。

    另外,如果你想在读取数据时将时间转换回原来的时区,可以使用 moment-timezone 库的 tz 方法。

    const user = await prisma.user.findFirst({
      where: {
        id: 1,
      },
    });
    
    const originalTime = moment.tz(user.createdAt, 'YYYY-MM-DD HH:mm:ss').tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss');
    

    在上面的代码中,我们使用 moment-timezone 库将 UTC 时间转换回原来的时区。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月1日