Blame view

天文台pc/tianwentai-ui/node_modules/date-fns/differenceInDays.js 3.45 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
  "use strict";
  exports.differenceInDays = differenceInDays;
  var _index = require("./differenceInCalendarDays.js");
  var _index2 = require("./toDate.js");
  
  /**
   * @name differenceInDays
   * @category Day Helpers
   * @summary Get the number of full days between the given dates.
   *
   * @description
   * Get the number of full day periods between two dates. Fractional days are
   * truncated towards zero.
   *
   * One "full day" is the distance between a local time in one day to the same
   * local time on the next or previous day. A full day can sometimes be less than
   * or more than 24 hours if a daylight savings change happens between two dates.
   *
   * To ignore DST and only measure exact 24-hour periods, use this instead:
   * `Math.trunc(differenceInHours(dateLeft, dateRight)/24)|0`.
   *
   * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
   *
   * @param dateLeft - The later date
   * @param dateRight - The earlier date
   *
   * @returns The number of full days according to the local timezone
   *
   * @example
   * // How many full days are between
   * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?
   * const result = differenceInDays(
   *   new Date(2012, 6, 2, 0, 0),
   *   new Date(2011, 6, 2, 23, 0)
   * )
   * //=> 365
   *
   * @example
   * // How many full days are between
   * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?
   * const result = differenceInDays(
   *   new Date(2011, 6, 3, 0, 1),
   *   new Date(2011, 6, 2, 23, 59)
   * )
   * //=> 0
   *
   * @example
   * // How many full days are between
   * // 1 March 2020 0:00 and 1 June 2020 0:00 ?
   * // Note: because local time is used, the
   * // result will always be 92 days, even in
   * // time zones where DST starts and the
   * // period has only 92*24-1 hours.
   * const result = differenceInDays(
   *   new Date(2020, 5, 1),
   *   new Date(2020, 2, 1)
   * )
   * //=> 92
   */
  function differenceInDays(dateLeft, dateRight) {
    const _dateLeft = (0, _index2.toDate)(dateLeft);
    const _dateRight = (0, _index2.toDate)(dateRight);
  
    const sign = compareLocalAsc(_dateLeft, _dateRight);
    const difference = Math.abs(
      (0, _index.differenceInCalendarDays)(_dateLeft, _dateRight),
    );
  
    _dateLeft.setDate(_dateLeft.getDate() - sign * difference);
  
    // Math.abs(diff in full days - diff in calendar days) === 1 if last calendar day is not full
    // If so, result must be decreased by 1 in absolute value
    const isLastDayNotFull = Number(
      compareLocalAsc(_dateLeft, _dateRight) === -sign,
    );
    const result = sign * (difference - isLastDayNotFull);
    // Prevent negative zero
    return result === 0 ? 0 : result;
  }
  
  // Like `compareAsc` but uses local time not UTC, which is needed
  // for accurate equality comparisons of UTC timestamps that end up
  // having the same representation in local time, e.g. one hour before
  // DST ends vs. the instant that DST ends.
  function compareLocalAsc(dateLeft, dateRight) {
    const diff =
      dateLeft.getFullYear() - dateRight.getFullYear() ||
      dateLeft.getMonth() - dateRight.getMonth() ||
      dateLeft.getDate() - dateRight.getDate() ||
      dateLeft.getHours() - dateRight.getHours() ||
      dateLeft.getMinutes() - dateRight.getMinutes() ||
      dateLeft.getSeconds() - dateRight.getSeconds() ||
      dateLeft.getMilliseconds() - dateRight.getMilliseconds();
  
    if (diff < 0) {
      return -1;
    } else if (diff > 0) {
      return 1;
      // Return 0 if diff is 0; return NaN if diff is NaN
    } else {
      return diff;
    }
  }