- 时刻字符串: 指的是 YYYY-MM-DD 、 HH:mm:ss诸如,在本地显现的时刻字符串
了解时刻和时区
A
假定张三在A区域(+8)执行了一行代码,new Date(‘2022-01-01 00:00:00:000’).valueOf(),一起老王在B区域(+7)区域也执行了这行代码,请问他们获得的时刻戳是否相同?
答: 不相同。为什么呢,因为A区域 22年一月一号0点的时分,B区域比咱们早了一个钟, 时钟上显现着 ‘2021-12-31 23:00:00’,而当B区域到了22年一月一日0点的时分,咱们现已过了一个钟时钟上显现的是 ‘2022-01-01 01:00:00’
// A区域 +8
new Date('2022-01-01 00:00:00:000').valueOf() // 1640966400000
// B区域 +7
new Date('2022-01-01 00:00:00:000').valueOf() // 1640970000000
B
假定张三在A区域(+8)执行了一行代码,new Date(1640966400000),一起老王在B区域(+7)区域也执行了这行代码,请问他们获得的时刻戳是否相同?
答: 不相同。这个原因和上面是一样的,同一个时刻,不同的区域上,时钟显现的是不一样的,ID比咱们早了一个时区,自然是比咱们快了一个钟。
// A +8
new Date(1640966400000) // Sat Jan 01 2022 00:00:00 GMT+0800 (A区域标准时刻)
// B +7
new Date(1640966400000) // Fri Dec 31 2021 23:00:00 GMT+0700 (B区域标准时刻)
从这两个比如咱们能够看到,
- 当时刻字符串相一起,在不同的区域获得的时刻戳是不同的
- 当时刻戳相一起,在不同的区域获取的时刻字符串是不同的
看到这里,你似乎现已对时刻、时区、时刻字符串有了一个开始的印象和了解。
关于时刻和时区
-
时刻是什么?
这是个很深入的问题了,关于时刻的界说,很杂乱。可是简单来说,指的是某一瞬间。
-
时刻戳、UTC、GMT这些都是什么?
参考: 日期与时刻(UTC、GMT、时刻戳、时区)
-
时刻戳需求了解时区概念吗?
时刻戳是不需求考虑时区概念的。
为什么这样说,假定 1657535893504(东八区 2022-07-11 18:39:22) 这个时刻戳,无论在哪个国家哪个区域,它都代表着某一个时刻时刻,它是时刻自身的记载。
-
那时刻字符串有时区概念呢?
当然有,因为在不同的时区下,同一个时刻字符串代表的是不同的时刻自身。 时刻字符串只是当地时刻的一个表达。
-
时刻字符串和 UTC 、 GMT有什么区别,不都是字符串吗?
Good,福尔摩斯的你现已发现了端倪。 ‘2022-01-01 00:00:00’ 和 ‘Sat Jan 01 2022 00:00:00 GMT+0800 (我国标准时刻)’ 尽管同样都是字符串,可是前者没有时区,所以在不同的时区下,它代表着不同的时刻,后者带上了时区,它永久地指向了一个特定的时刻。
-
了解dayjs目标?
咱们应该知道dayjs目标本质上便是时刻,在了解 时区、本地字符串、时刻的关系和转化时,咱们需求把dayjs目标当成时刻当成时刻戳去处理。
Dayjs的使用
从上面咱们知道, 时刻字符串 + 时区 = 时刻。 那咱们再来了解一下dayjs的api
-
dayjs()
这是最根底的一个api。调用时,时区都是机器时区,无论你是否设置了tz的默许时区。
从下面能够看到,当咱们传入一个普通的时刻字符串时,它是指咱们本地的2022-01-01
-
dayjs().tz() // tz(timezone?: string, keepLocalTime?: boolean): Dayjs
interface Dayjs { tz(timezone?: string, keepLocalTime?: boolean): Dayjs }
能够注意到,此刻的tz是dayjs实例上的共有函数,它的作用是转化时区。记住咱们上面的等式, 时刻字符串 + 时区 = 时刻。所以,时区改动了,要么时刻字符串改动,要么时刻改动,这里是通过第二个参数去控制的,不传第二个函数默许是false。
- keepLocalTime为false, 时刻不变,时刻字符串改动了
- keepLocalTime 为 true , 时刻字符串没变,时刻变了
-
dayjs.tz()
能够先看下它的类型界说
interface DayjsTimezone { (date: ConfigType, timezone?: string): Dayjs (date: ConfigType, format: string, timezone?: string): Dayjs } const tz: DayjsTimezone
首要和第二个函数不同,它是挂载在dayjs上的静态函数,它的作用和第一个函数 dayjs() 相似,都是用来结构dayjs目标的,可是不同的是,你能够指定你的目标时区,假如第二个参数没传,会使用tz.setDefault指定的时区
仍然是那个等式, 时刻字符串 + 时区 = 时刻,所以假如第一个参数传入了时刻字符串,那么便是 时刻字符串 + 指定时区, 假如传入的是时刻,则format的时分是成果会不同
-
传入时刻字符串
-
传入时刻
-
传入dayjs
在上面咱们说过,dayjs目标需求当成时刻来了解,所以传入dayjs 等同于 传入时刻。那么当咱们需求坚持时刻字符串不变时,那咱们就需求先format一下。
可能有的同学现已发现了,已然传入的是dayjs,为啥不直接调用第二个比如, tz这个实例办法呢? 这里有两个理由:
-
假如是时刻选择器出来的时刻,这个dayjs可能是没有tz这个实例办法的,因为没有承继过timezone
dayjs.extend(utc) dayjs.extend(timezone)
-
通常来说,都是用dayjs.tz.setDefault 设置一个默许的目标时区,而tz这个实例办法,又不能绕开第一个参数去设置第二个参数
-
-