typescript 中的时间处理

typescript/ javasctipt 中, 时间 是一个 构造 函数, 需要通过 const dt = new Date(xxx) 进行初始化创建时间对象。

创建时间对象

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 获取当前时间对象
const now = new Date()

// 将字符串时间转换为 Date 时间对象
const timeStr = '2021-08-23T02:42:17Z'
const dt = new Date(timeStr)

// 根据数字创建时间
const dt2 = new Date(Date.UTC(2006, 0, 2, 15, 4, 5));
console.log("event:::", dt2);

时间操作

获取时间对象的属性值

通过 getXXX() 方法, 可以获取时间对象的具体属性至。

1
2
3
4
5
6
7
8
9
// 将字符串时间转换为 Date 时间对象
const timeStr = '2006-01-02T13:04:05Z'
const dt = new Date(timeStr)
console.log("dt:::", dt)  // dt::: 2006-01-02T13:04:05.000Z
// 获取时间信息
const year = dt.getFullYear() // 2021
const month = dt.getMonth() // 8
const date = dt.getDate() // 23
console.log(`${year}-${month}-${date}`); // 2021-7-23

注意: 由于奇奇怪怪的原因, month 的取值范围是 0-11 , 也就是说 0 -> 1月,11 -> 12月。

时间对象转字符串

通过 toXXXString() 方法,可以将时间转化为字符串对象。 但是 大多数转换结果都和本地时区和语言设置有关。

toISOString()

其中, toISOString() 方法返回一个 ISO格式的字符串: YYYY-MM-DDTHH:mm:ss.sssZ。时区总是UTC(协调世界时),加一个后缀 Z 标识。

1
2
const dtStr = dt.toISOString()
console.log("toISOString,,,", dtStr) // 2006-01-02T13:04:05.000Z

toJSON()

返回一个 时间对象的字符串, 常用于 JSON 序列化, 内部使用 toISOString() ,所以输出格式是一样的。

1
const dtJSonStr = dt.toJSON() // 2006-01-02T13:04:05.000Z

时间对象比较

时间对象是可以直接通过 比较符 比较的,可以看作转换成 timestamp 数字后的大小比较。

1
2
3
4
5
6
7
// 时间比较
// dt: 2006-01-02 
// now: 2021-08-23
if (dt > now) {
    console.log("dt > now = ", true) // 不会结果显示, 因为条件为假
}
console.log("dt > now = ", dt > now)  // false

修改时间

使用 setXXX() 方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
const event = new Date('December 31, 1975 23:15:30 GMT-3:00');

console.log(event.getUTCFullYear());
// expected output: 1976

console.log(event.toUTCString());
// expected output: Thu, 01 Jan 1976 02:15:30 GMT

event.setUTCFullYear(1975);

console.log(event.toUTCString());
// expected output: Wed, 01 Jan 1975 02:15:30 GMT

相对时间操作

typescrtip 本身没有提供 时间对象获取相对时间 的操作方法。 可以通过 setXXX() 方法来时间

注意: setXXX() 返回会修改时间 对象本身

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 获取当前时间
const now = new Date()
console.log("now:::", now) // now::: 2021-08-25T10:07:43.932Z

// 修改时间
const delta = now.getFullYear() + 1
now.setFullYear(delta)

// console.log NOW <<<<
console.log("1 year laster, now:::", now);  // 1 year laster, now::: 2022-08-25T10:07:43.932Z

时间深拷贝

由于 setXXX() 是会修改原数据的, 那么一些时候, 就需要用到时间的深拷贝。 核心思想就是通过 序列化/反序列化 完成一个 全新时间对象 的创建, 当然,其字面值是相同的。

1
2
3
4
5
6
7
8
// 深度拷贝
const now2 = new Date(now.toJSON())

console.log(now2, now) // 2022-08-25T10:24:31.700Z 2022-08-25T10:24:31.700Z

console.log(ow2 == now)  // false 时间对象对比
console.log(now2 >= now)  // true 时间对象对比
console.log(now.toJSON() === now2.toJSON()) // true 字面值对比