如何在Node.js/Express项目使用UTC时区并配置Prisma模型时间字段
1 Node.js(含Express.js)项目全局UTC时区配置
- 最推荐的方式是启动进程时传入
TZ环境变量,无需修改业务代码:- Linux/macOS环境启动命令:
TZ=UTC node your_app_entry.js - Windows cmd环境启动命令:
set TZ=UTC && node your_app_entry.js - Windows PowerShell环境启动命令:
$env:TZ='UTC'; node your_app_entry.js - 若使用PM2托管进程,可以在ecosystem配置文件的
env字段中添加TZ: "UTC"配置
- Linux/macOS环境启动命令:
- 也可以在项目入口文件的最顶部添加代码设置时区:
process.env.TZ = 'UTC',注意这行代码必须放在所有import/require语句之前,否则部分提前读取时区的第三方包不会生效 - 完成以上配置后,Node进程内所有
new Date()、时间格式化等操作默认都会使用UTC时区,Express层面无需额外适配
2 Prisma.js DateTime字段UTC时间配置
Prisma的@default(now())、@updatedAt生成的时间默认取数据库服务的时区,所以按以下步骤配置即可:
- 第一步:将数据库服务的默认时区设置为UTC,不同数据库配置方式不同:
- MySQL:修改my.cnf配置文件,添加
default-time-zone = '+00:00'后重启服务 - PostgreSQL:修改postgresql.conf配置文件,添加
timezone = 'UTC'后重启服务 - 云数据库直接在厂商控制台的参数配置页修改时区参数即可
- MySQL:修改my.cnf配置文件,添加
- 第二步:修改Prisma Schema中的DateTime字段定义,指定字段存储UTC时间,修改后的你的Profile模型如下:
// PostgreSQL场景 model Profile { CreatedDate DateTime @default(now()) @db.Timestamptz ModifiedDate DateTime? @updatedAt @db.Timestamptz } // MySQL场景 model Profile { CreatedDate DateTime @default(now()) @db.DateTime(0) ModifiedDate DateTime? @updatedAt @db.DateTime(0) }
- 若不想修改数据库全局时区,也可以自行指定生成UTC时间的数据库函数,比如MySQL场景可以将默认值改为
@default(dbgenerated("UTC_TIMESTAMP()")),不过该方式和数据库强绑定,兼容性较差,优先推荐修改数据库全局时区的方案 - 注意:如果项目已经上线运行过迁移,修改字段类型需要生成新的迁移文件验证后再执行,避免损坏存量数据
内容的提问来源于stack exchange,提问作者x19
相关产品推荐
相关产品推荐

