• 时刻字符串: 指的是 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区域标准时刻)

从这两个比如咱们能够看到,

  • 时刻字符串相一起,在不同的区域获得的时刻戳是不同的
  • 时刻戳相一起,在不同的区域获取的时刻字符串是不同的

看到这里,你似乎现已对时刻、时区、时刻字符串有了一个开始的印象和了解。

关于时刻和时区

  1. 时刻是什么?

    这是个很深入的问题了,关于时刻的界说,很杂乱。可是简单来说,指的是某一瞬间。

  2. 时刻戳、UTC、GMT这些都是什么?

    参考: 日期与时刻(UTC、GMT、时刻戳、时区)

  3. 时刻戳需求了解时区概念吗?

    时刻戳是不需求考虑时区概念的。

    为什么这样说,假定 1657535893504(东八区 2022-07-11 18:39:22) 这个时刻戳,无论在哪个国家哪个区域,它都代表着某一个时刻时刻,它是时刻自身的记载。

  4. 那时刻字符串有时区概念呢?

    当然有,因为在不同的时区下,同一个时刻字符串代表的是不同的时刻自身。 时刻字符串只是当地时刻的一个表达。

  5. 时刻字符串和 UTC 、 GMT有什么区别,不都是字符串吗?

    Good,福尔摩斯的你现已发现了端倪。 ‘2022-01-01 00:00:00’ 和 ‘Sat Jan 01 2022 00:00:00 GMT+0800 (我国标准时刻)’ 尽管同样都是字符串,可是前者没有时区,所以在不同的时区下,它代表着不同的时刻,后者带上了时区,它永久地指向了一个特定的时刻。

  6. 了解dayjs目标?

    咱们应该知道dayjs目标本质上便是时刻,在了解 时区、本地字符串、时刻的关系和转化时,咱们需求把dayjs目标当成时刻当成时刻戳去处理。

Dayjs的使用

从上面咱们知道, 时刻字符串 + 时区 = 时刻。 那咱们再来了解一下dayjs的api

  1. dayjs()

    这是最根底的一个api。调用时,时区都是机器时区无论你是否设置了tz的默许时区

    从下面能够看到,当咱们传入一个普通的时刻字符串时,它是指咱们本地的2022-01-01 image.png

  2. dayjs().tz() // tz(timezone?: string, keepLocalTime?: boolean): Dayjs

    interface Dayjs {
        tz(timezone?: string, keepLocalTime?: boolean): Dayjs
    }
    

    能够注意到,此刻的tz是dayjs实例上的共有函数,它的作用是转化时区。记住咱们上面的等式, 时刻字符串 + 时区 = 时刻。所以,时区改动了,要么时刻字符串改动,要么时刻改动,这里是通过第二个参数去控制的,不传第二个函数默许是false

    • keepLocalTimefalse, 时刻不变,时刻字符串改动了 image.png
    • keepLocalTimetrue , 时刻字符串没变,时刻变了 image.png
  3. 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的时分是成果会不同

    • 传入时刻字符串 image.png

    • 传入时刻 image.png

    • 传入dayjs image.png

      在上面咱们说过,dayjs目标需求当成时刻来了解,所以传入dayjs 等同于 传入时刻。那么当咱们需求坚持时刻字符串不变时,那咱们就需求先format一下。 image.png

      可能有的同学现已发现了,已然传入的是dayjs,为啥不直接调用第二个比如, tz这个实例办法呢? 这里有两个理由:

      1. 假如是时刻选择器出来的时刻,这个dayjs可能是没有tz这个实例办法的,因为没有承继过timezone

        dayjs.extend(utc)
        dayjs.extend(timezone)
        
      2. 通常来说,都是用dayjs.tz.setDefault 设置一个默许的目标时区,而tz这个实例办法,又不能绕开第一个参数去设置第二个参数