Appearance
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
- 示例:
1596740500
或1596740500000
- 含义: 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:ss
或DD/MM/YYYY HH:mm:ss
- 示例:
05/12/2025 02:51:15
或12/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
主要在英语国家使用,区分 AM 和 PM
- 格式:
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()};