提升系列:16.获取格式化时间区间-3-8

83 阅读2分钟

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

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

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

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

提升系列

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

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

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

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

在这个系列里,我能想到的或者实现方法,不一定是最好的。欢迎大家一起来参与讨论,有好的想法也可以告诉我一下。

前言

在上一篇文章里,我们调试momentjs源码时,发现momentjs的subtract方法,是调用createAdder方法后,赋值给它的。而查看createAdder方法,发现它最后是执行了addSubtract方法,我们查看一下addSubtract方法。

实现

我们在vscode里搜索一下addSubtract方法,找到它定义的地方

function addSubtract(mom, duration, isAdding, updateOffset) {
    var milliseconds = duration._milliseconds,
      days = absRound(duration._days),
      months = absRound(duration._months);
​
    if (!mom.isValid()) {
      // No op
      return;
    }
​
    updateOffset = updateOffset == null ? true : updateOffset;
​
    if (months) {
      setMonth(mom, get(mom, "Month") + months * isAdding);
    }
    if (days) {
      set$1(mom, "Date", get(mom, "Date") + days * isAdding);
    }
    if (milliseconds) {
      mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
    }
    if (updateOffset) {
      hooks.updateOffset(mom, days || months);
    }
  }

addSubtract方法,传递了4个参数

  • mom:momentjs的实例对象
  • duration:它的偏移值
  • isAdding:控制偏移方向
  • updateOffset:暂时不知道干啥

addSubtract方法,先是从duration里面,拿出毫秒、天数、月份数。

接着判断mom是否是momentjs实例对象,如果不是,直接return,不做其它操作。

接着,判断updateOffset的值。根据updateOffset的传值,来进行重新赋值。

接着判断months是否存在,存在,就执行setMonth方法。

判断days是否存在,存在就执行set$1方法。

判断milliseconds是否存在,存在,就调用mom._d.setTime方法。

判断updateOffset是否存在,存在,就调用hooks.updateOffset方法。

判断逻辑挺多的,要调用的方法也有点多。就不一一看了。

小结

本小节把momentjs的代码,拿过来进行调试。主要是查看了addSubtract方法定义,分析它的执行逻辑。

不过它里面要调用的方法有点多,就不每个方法都查看了,如果大家感兴趣,可以自己去查看一下。

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

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