如何强制PrismaClient将DateTime字段返回为Unix时间戳而非JavaScript日期对象
解决PrismaClient返回DateTime为Date对象而非Unix时间戳的问题
方法1:手动转换Date对象
拿到查询结果后,直接调用Date对象的getTime()(毫秒级)或valueOf()方法获取时间戳,若需要秒级时间戳则除以1000并取整:
const prisma = new PrismaClient() const mySettings = await prisma.settings.findFirst() const updatedAtTimestamp = mySettings.updatedAt.getTime() // 毫秒级时间戳 // 秒级时间戳:Math.floor(mySettings.updatedAt.getTime() / 1000) console.log(updatedAtTimestamp)
方法2:查询时用数据库函数直接返回时间戳
根据你使用的数据库类型,在查询时通过select指定原生函数提取Unix时间戳:
适用于MySQL/MariaDB
const prisma = new PrismaClient() const mySettings = await prisma.settings.findFirst({ select: { id: true, updatedAt: { raw: 'UNIX_TIMESTAMP(updatedAt)' } } }) // 返回的updatedAt为秒级时间戳数值 console.log(mySettings.updatedAt)
适用于PostgreSQL
const prisma = new PrismaClient() const mySettings = await prisma.settings.findFirst({ select: { id: true, updatedAt: { raw: 'EXTRACT(EPOCH FROM updatedAt)' } } }) // 返回的updatedAt为秒级时间戳(可能是浮点数,可转成整数) console.log(Math.floor(mySettings.updatedAt))
方法3:用Prisma中间件自动全局转换
创建全局中间件,拦截所有查询结果,自动将DateTime类型字段转为时间戳:
const prisma = new PrismaClient() prisma.$use(async (params, next) => { const result = await next(params) // 处理单条数据结果 if (typeof result === 'object' && result !== null) { for (const key in result) { if (result[key] instanceof Date) { // 替换为毫秒级时间戳,如需秒级则改为 result[key].getTime() / 1000 | 0 result[key] = result[key].getTime() } } } // 处理数组结果 else if (Array.isArray(result)) { result.forEach(item => { for (const key in item) { if (item[key] instanceof Date) { item[key] = item[key].getTime() } } }) } return result }) // 后续所有查询都会自动转换DateTime字段 const mySettings = await prisma.settings.findFirst() console.log(mySettings.updatedAt) // 直接输出时间戳
注意:方法3会全局生效,若有部分DateTime字段无需转换,可在中间件中添加模型或字段名的过滤逻辑。
内容的提问来源于stack exchange,提问作者Liam Pillay
相关产品推荐
相关产品推荐

