Skip to content

NestJS-时间处理

我们查询的时候会发现,默认nestJS给我们返回的时间格式是这样子的

javascript
"2025-05-12T02:51:15.000Z"

这其实是UTC国际时间,加上时区就成为了我们正常的时间,认识一下我们常见的几种时间格式以及代表的含义

1、认识时间格式及含义

1. ISO 8601 格式

  • ISO 8601 格式是全球通用的标准,通常用于数据交换和存储。
  • 格式: YYYY-MM-DDTHH:mm:ss.sssZ
  • 示例: 2025-05-12T02:51:15.000Z
  • 含义: ISO 8601 是国际标准时间格式,常用于表示日期和时间。T 分隔日期和时间部分,Z 表示该时间是 UTC(协调世界时)时间。这个格式适合进行国际化的时间存储和传输。

2. Unix 时间戳(Epoch 时间)

javascript
以秒数或毫秒数表示时间,常用于编程和计算机系统
  • 格式: 秒数表示的时间戳,如 1596740500 或毫秒时间戳 1596740500000
  • 示例: 15967405001596740500000
  • 含义: Unix 时间戳表示自1970年1月1日00:00:00 UTC以来的秒数(或毫秒数)。这种格式通常用于编程中处理时间,因为它是一个数字,便于存储和计算。

3. RFC 2822 格式

javascript
主要用于电子邮件
  • 格式: Day, DD Month YYYY HH:mm:ss +0000
  • 示例: Mon, 12 May 2025 02:51:15 +0000
  • 含义: RFC 2822 格式常用于电子邮件的头部信息。它包含了星期几、日期、月份、年份、时间(24小时制)以及时区偏移量。

4. 自定义格式(常见于日志或用户界面)

  • 格式: MM/DD/YYYY HH:mm:ssDD/MM/YYYY HH:mm:ss
  • 示例: 05/12/2025 02:51:1512/05/2025 02:51:15
  • 含义: 这是一种常见的日期时间格式,用户界面中经常使用。格式的差异主要体现在日期和月份的顺序,不同的地区(如美国和欧洲)可能会有所不同。

5. UTC 时间

  • 格式: YYYY-MM-DD HH:mm:ss UTC
  • 示例: 2025-05-12 02:51:15 UTC
  • 含义: UTC(协调世界时)是世界标准时间,常用于跨时区的系统中。UTC 时间没有时区偏移,适用于全球时间协调。

6. 本地时间(含时区偏移)

javascript
随着地区和文化不同
  • 格式: YYYY-MM-DD HH:mm:ss +hh:mm
  • 示例: 2025-05-12 10:51:15 +08:00
  • 含义: 这种格式表示本地时间并包含时区的偏移量。例如,+08:00 表示该时间是 UTC 时间加上 8 小时,通常用于亚洲地区(如中国、马来西亚等)。

7. 12小时制

javascript
主要在英语国家使用,区分 AMPM
  • 格式: MM/DD/YYYY hh:mm:ss AM/PM
  • 示例: 05/12/2025 02:51:15 AM
  • 含义: 12小时制时间格式通常使用 AM(上午)和 PM(下午)来区分时间。常见于美国和一些英语国家。

8. 简化的日期格式

  • 格式: YYYY-MM-DD
  • 示例: 2025-05-12
  • 含义: 这种格式只表示日期,不包含具体的时间信息。适用于表示纯日期信息的场景。

9. 时间格式(不含日期)

  • 格式: HH:mm:ss
  • 示例: 02:51:15
  • 含义: 仅表示时间(小时、分钟和秒),不包括日期。这种格式常用于显示当前的时间。

2、时间格式处理以及依赖

👉需求

接下来我们就把我们的格式转为我们常见的格式

javascript
也就是这种时间格式"2025-05-12T02:51:15.000Z" 
   => 转化为
2025-05-08 16:15:07

先看看我们数据库实体设置

javascript

  @Column({ type: 'datetime', nullable: true, default: () => 'CURRENT_TIMESTAMP', comment: '创建时间' })
  createTime: Date | null;

  @Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP', comment: '更新时间' })
  updateTime: Date;

我们的时间格式

javascript
// 数据库格式
2025-05-12 11:07:35

//查询出的时间格式
createTime:"2025-05-12T03:07:35.000Z"

👉安装class-transformer

javascript
npm install class-transformer


yarn add class-transformer

👉安装date-fns-tz 库(可选)

date-fns-tz库是我们常用与时间格式处理的库之一,js编写

接下来我们就使用 date-fns-tz 库来转换 UTC 时间到本地时区

javascript
npm install date-fns-tz


yarn add date-fns-tz

3、处理时间格式

👉transformer实体字段格式化(使用)

javascript
import { format } from "date-fns";

@Column({
    type: "timestamp",
    default: () => "CURRENT_TIMESTAMP",
    transformer: {
      to: (value: Date) => value, // 写入数据库时不处理
      from: (value: Date) => 
        value ? format(new Date(value), "yyyy-MM-dd HH:mm:ss") : null, // 读取时格式化
    },
  })
  createTime: string; // 注意类型改为 string(如果直接返回字符串)

这个时候再进行搜索,我们的时间数据已经成为了下面的格式

javascript
createTime:"2025-05-12 11:28:37"

👉项目使用

javascript
 @Column({
    type: "timestamp",
    default: () => "CURRENT_TIMESTAMP", // 数据库自动设置创建时间
    transformer: {
      to: (value: Date) => value, // 写入数据库时保持 Date 类型
      from: (value: Date) => 
        value ? format(new Date(value), "yyyy-MM-dd HH:mm:ss") : null, // 读取时转为字符串
    },
  })
  createTime: Date; // 类型保持为 Date
  


  @Column({
    type: "timestamp",
    default: () => "CURRENT_TIMESTAMP", // 默认值
    onUpdate: "CURRENT_TIMESTAMP", // 关键配置,确保更新时间字段自动更新
    transformer: {
      to: (value: Date) => value,
      from: (value: Date) => 
        value ? format(new Date(value), "yyyy-MM-dd HH:mm:ss") : null,
    },
  })
  updateTime: Date; // 类型保持为 Date

👉更新接口中保证时间最新

javascript
//时刻保证我们更新接口数据最新

const updatedUser = { ...user, ...updateFormData ,updateTime: new Date()};

Released under the MIT License.