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

77 阅读3分钟

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

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

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

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

提升系列

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

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

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

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

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

前言

在上一篇文章里,我们介绍了momentjs源码里面的Duration构造函数里,使用到的normalizeObjectUnits函数。

接下来,我们要看下另外一个函数-bubble,看下该函数里的逻辑是什么。

实现

我们先在vscode里面搜索一下Duration方法,查找了一会,找到了Duration方法的定义:

 function Duration(duration) {
    var normalizedInput = normalizeObjectUnits(duration),
      years = normalizedInput.year || 0,
      quarters = normalizedInput.quarter || 0,
      months = normalizedInput.month || 0,
      weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
      days = normalizedInput.day || 0,
      hours = normalizedInput.hour || 0,
      minutes = normalizedInput.minute || 0,
      seconds = normalizedInput.second || 0,
      milliseconds = normalizedInput.millisecond || 0;
​
    this._isValid = isDurationValid(normalizedInput);
​
    // representation for dateAddRemove
    this._milliseconds =
      +milliseconds +
      seconds * 1e3 + // 1000
      minutes * 6e4 + // 1000 * 60
      hours * 1000 * 60 * 60; 
    this._days = +days + weeks * 7;
    this._months = +months + quarters * 3 + years * 12;
​
    this._data = {};
​
    this._locale = getLocale();
​
    this._bubble();
  }

我们可以看到,在Duration构造函数的最后面,调用了一个叫做_bubble的函数。

该函数的作用是什么呢?

我们点击该函数,进行跳转到其函数定义的位置

function bubble() {
    var milliseconds = this._milliseconds;
    var days = this._days;
    var months = this._months;
    var data = this._data;
    var seconds, minutes, hours, years, monthsFromDays;
​
    if (
      !(
        (milliseconds >= 0 && days >= 0 && months >= 0) ||
        (milliseconds <= 0 && days <= 0 && months <= 0)
      )
    ) {
      milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
      days = 0;
      months = 0;
    }
​
    data.milliseconds = milliseconds % 1000;
​
    seconds = absFloor(milliseconds / 1000);
    data.seconds = seconds % 60;
​
    minutes = absFloor(seconds / 60);
    data.minutes = minutes % 60;
​
    hours = absFloor(minutes / 60);
    data.hours = hours % 24;
​
    days += absFloor(hours / 24);
​
    monthsFromDays = absFloor(daysToMonths(days));
    months += monthsFromDays;
    days -= absCeil(monthsToDays(monthsFromDays));
​
    years = absFloor(months / 12);
    months %= 12;
​
    data.days = days;
    data.months = months;
    data.years = years;
​
    return this;
  }

我们可以看到,bubble函数的代码非常多,比我们上一次分析的normalizeObjectUnits函数的代码要多了很多。

代码看起来有点多,逻辑显得有点复杂。不过没关系,让我们分析一下bubble函数里的代码逻辑:

1.从Dutarion的实例对象里拿出下面属性值

1._milliseconds

2._days

3._months

4._data

2.判断一下milliseconds,days,months几个值是否都是相同的,比如都是正值或者负值。如果不是,计算时长的毫秒数,把days和months赋值为0

3.再利用milliseconds计算:milliseconds,seconds,minutes,hours,days,months,years的值,然后赋值给data对象。

4.这时我们就要回到Duration构造函数里再看一下,给_data属性赋值了一个空对象。

当时只是赋值了一个空对象,没有做任何操作。原来是在bubble方法里做了处理,给_data赋值。

5.最后返回Duration构造函数的实例对象

我们可以看到,主要是对Duration构造函数的实例对象的milliseconds,seconds,minutes,hours,days,months,years的值进行重新计算,赋值给_data对象。

小结

本篇文章总结:

本小节主要是分析了Duration构造函数里,最后调用到的_bubble函数。该函数主要是对Duration构造函数的实例对象的milliseconds,seconds,minutes,hours,days,months,years的值进行了重新计算,然后赋值给_data对象。

如果大家有疑问,也可以自己到源码里查看一下。欢迎大家沟通交流。

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

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