提升系列:22.获取格式化时间区间-4-6

31 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18天,点击查看活动详情

上一次掘金的征文活动,准确来说,应该是去年的最后一次掘金官方的征文活动,我没有参加那一次征文活动。距离上一次征文,好像有两三个月了,感觉时间过得有点漫长了,都快要忘记掘金的征文活动了。

现在掘金推出了新的一年的征文活动-掘金日新计划 · 2 月更文挑战,又要开始新的一年,新的一轮的征文挑战了。

征文挑战已经开始了,而我即将要参与这次征文活动,参与挑战,挑战自己。

提升系列

提升系列,我主要是想写一些平时工作上面,自己会用到的一些好的技巧或者方法。当然,这些技巧和方法是针对我自己的。

除此之外,还可能会写一些解决难点的方法。比如,遇到了某个难点,要通过什么方法来解决它?

正如它的名字一样--提升,通过学习一些好的技巧、方法,或者解决一些难题、难点,来提升我们的能力。

出这个提升系列,一方面,是提升自己的开发能力;另一方面,也希望这个提升系列,可以帮助到部分人,提升他们的开发能力。

在这个系列里,我能想到的或者实现方法,不一定是最好的。欢迎大家参与讨论。

前言

在上一篇文章提升系列:21.获取格式化时间区间-4-5里,我们分析了dayjs源码里面的变量C。

变量C其实就是定义了一些常量,然后导出这些常量,在dayjs的各处代码里进行使用。

接下来,我们继续看一下add方法里面还调用了哪些方法?

dayjs

Day.js是一个极简的JavaScript库,可以为现代浏览器解析、验证、操作和显示日期和时间

这是dayjs官网上面的介绍,我们可以使用dayjs来进行日期、时间方面相关的操作。

查阅

我们到dayjs的仓库里面,把源码下载下来。下载解压后,我们在vscode里,把代码打开。

我们先找到add方法定义的地方

  add(number, units) {
    number = Number(number) // eslint-disable-line no-param-reassign
    const unit = Utils.p(units)
    const instanceFactorySet = (n) => {
      const d = dayjs(this)
      return Utils.w(d.date(d.date() + Math.round(n * number)), this)
    }
    if (unit === C.M) {
      return this.set(C.M, this.$M + number)
    }
    if (unit === C.Y) {
      return this.set(C.Y, this.$y + number)
    }
    if (unit === C.D) {
      return instanceFactorySet(1)
    }
    if (unit === C.W) {
      return instanceFactorySet(7)
    }
    const step = {
      [C.MIN]: C.MILLISECONDS_A_MINUTE,
      [C.H]: C.MILLISECONDS_A_HOUR,
      [C.S]: C.MILLISECONDS_A_SECOND
    }[unit] || 1 // ms
​
    const nextTimeStamp = this.$d.getTime() + (number * step)
    return Utils.w(nextTimeStamp, this)
  }

在add方法里面,调用到了Utils.w方法。那这个Utils.w方法又是什么呢?

我们在vscode里面查找一下Utils.w

Utils.w = wrapper

我们可以看到,把wrapper方法赋值给到Utils.w

我们查看一下wrapper定义的地方

const wrapper = (date, instance) =>
  dayjs(date, {
    locale: instance.$L,
    utc: instance.$u,
    x: instance.$x,
    $offset: instance.$offset // todo: refactor; do not use this.$offset in you code
  })

wrapper函数里面的代码比较少,直接就是调用dayjs方法,返回一个dayjs的实例对象。不过还把偏移前的时间也传递,作为创建dayjs的实例对象的配置项传递进去。

到这里,Utils.w方法的代码就分析完了。

小结

本篇文章总结:

本小节,主要是查看了Utils.w方法的定义。代码比较简单,调用dayjs方法,最后返回一个dayjs的实例对象出来。

最后,放上自己比较喜欢的一句诗句:

千淘万漉虽辛苦,吹尽狂沙始到金 - 唐 刘禹锡《浪淘沙》