如何让dayjs对格式化值或本地时间进行算术运算?

问题描述 投票:0回答:1

作为参考,我住在新西兰,目前处于 GMT+13。目前发布时间为2月25日下午3点。

我正在使用

dayjs
库,我需要创建一个格式化日期数组,给定最小和最大日期。我根据用户界面中选择的今天的偏移量计算最小值。我从预先确定的日期计算最大值。

我最初的尝试如下,

export function generateLabelRange(): string[] {
    const minimumDate = getMinimumDate();
    const maximumDate = getMaximumDateFromGoalInformation();

    const labelRange = maximumDate.diff(minimumDate, 'days');

    let labels = []
    for (let offSet = 0; offSet <= labelRange; offSet++) {
        labels.push(minimumDate.add(offSet, 'days').format("YYYY-MM-DD"));
    }
    return labels;
}

在此示例中,

minimumDate
是通过
dayjs().subtract(dateRange, 'days')
创建的,
maximumDate
是通过
dayjs("YYYY-MM-DD")
生成的。导致问题的示例如下,

const minimumDate = dayjs().subtract(14, 'days'); // Correctly 11th February
const maximumDate = dayjs("2024-03-05");          // Displayed as 4th March

我遇到的问题是

dayjs("2024-03-05")
代表的对象实际上是 3 月 4 日,而不是 5 日。格式化的时候只是第五次。这意味着,
maximumDate.diff(minimumDate, 'days')
将得到 22。但是,这是 3 月 4 日和 2 月 11 日之间的差异,而不是我用来创建日期的原始日期,即 3 月 5 日。正确的结果应该是 23,但它只循环了 22 次。因此,我的标签生成方法将关闭 1,具体取决于提供的最大日期。

因此,为了暂时解决这个问题,我现在比较格式化的日期,

export function generateLabelRange(): string[] {
    const minimumDate = getMinimumDate();
    const maximumDate = getMaximumDateFromGoalInformation().format("YYYY-MM-DD");

    let date = minimumDate;
    let formattedDate = date.format('YYYY-MM-DD');

    let labels: string[] = [];
    while (formattedDate !== maximumDate) {
        labels.push(formattedDate);

        date = date.add(1, 'days');
        formattedDate = date.format("YYYY-MM-DD");
    }

    labels.push(formattedDate);
    return labels;
}

虽然这感觉不太好,但是。如何更改

dayjs
以根据其格式化的日期执行加/减?

javascript date dayjs
1个回答
0
投票

编写这个函数时,我最初的实现使用 diff 方法来计算范围,但不起作用。

就这样出现了,

   const labelRange = maximumDate.diff(minimumDate, 'days');
 
   let labels = []
   for (let offSet = 0; offSet <= labelRange; offSet++) {
       labels.push(minimumDate.add(offSet, 'days').format("YYYY-MM-DD"));
   }

问题在于 diff 方法将以毫秒为单位计算天数差异,当将其转换为“天数”时,它总是向下舍入。因此,之间的区别,

  let today = dayjs("2024-02-26");
  let minimumDate = dayjs().subtract(3, 'days');
  today.diff(minimumDate, 'days');                  // 2
  today.diff(minimumDate, 'days', true)             // 2.159. This will always round down, i.e. 2.7 -> 2.

因此,要利用 diff 和减法,我们需要通过

startOf('days')
将最小日期的开始时间转换为午夜才能正确得到 3。但是,我们可以使用
isAfter
和一段时间,而不是使用 diff 并迭代一个范围循环。

除了使用

dayjs()
之外,对象会以当地时间进行运算,但会以UTC + 0显示。例如,创建一个对象为
dayjs("2024-02-26")
,即2月26日。这将在控制台上显示为
25th Feb 2024, 11:00:00 GMT
。这是因为在新西兰,夏令时期间我们目前处于 GMT + 13,这意味着控制台将在 GMT + 0 之前 13 小时显示,即 2 月 25 日上午 11 点。

© www.soinside.com 2019 - 2024. All rights reserved.