乐闻世界logo
搜索文章和话题

如何在 typeorm 中获取带有时区的时间戳?

4 个月前提问
3 个月前修改
浏览次数53

1个答案

1

在使用TypeORM处理数据库操作时,有时候我们需要处理时区相关的时间戳。对于这种情况,TypeORM提供了一些方法来处理带有时区的时间戳。以下是几种处理带时区时间戳的方法:

1. 设置全局时区

在连接数据库时,可以通过设置 timezone选项为你所需要的时区,这样所有的时间戳都将以这个时区来存储。例如,如果你使用的是PostgreSQL,可以在创建连接时设置时区:

javascript
import { createConnection } from 'typeorm'; createConnection({ type: "postgres", host: "localhost", port: 5432, username: "user", password: "password", database: "test", timezone: "UTC", // 设置为UTC时区 entities: [ // 实体列表 ], synchronize: true, }).then(connection => { // 连接成功 }).catch(error => console.log(error));

2. 在查询时指定时区

如果不想全局设置时区,也可以在执行具体查询时动态地指定时区。例如,在执行SQL查询时,可以在查询字符串中显式指定时区:

javascript
const users = await connection.manager.query( "SELECT *, TIMEZONE('Asia/Shanghai', creation_time) as local_time FROM users" );

这里 TIMEZONE('Asia/Shanghai', creation_time)函数是PostgreSQL提供的,用于将 creation_time列的时间转换为 Asia/Shanghai时区的时间。

3. 使用Date对象处理时区

在JavaScript中,Date对象本身是无时区的,它存储的是一个UTC时间戳。当你从数据库中获取时间戳并转化为 Date对象时,可以使用各种库(如 moment-timezonedate-fns-tz)来处理时区转换:

javascript
import moment from 'moment-timezone'; const user = await userRepository.findOne(userId); const creationTime = moment(user.creationTime).tz('Asia/Shanghai').format(); console.log(`用户创建时间(上海时区): ${creationTime}`);

4. 在实体类中处理时区

在TypeORM实体类中,可以通过getters和setters来自动处理时区转换。例如:

javascript
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; import moment from 'moment-timezone'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column({ type: 'timestamp with time zone' }) private _creationTime: Date; get creationTime(): string { return moment(this._creationTime).tz('Asia/Shanghai').format(); } set creationTime(value: string) { this._creationTime = moment.tz(value, 'Asia/Shanghai').toDate(); } }

这样,每次获取或设置 creationTime属性时,都会自动进行时区的转换。

2024年6月29日 12:07 回复

你的答案