作为参考,我住在新西兰,目前处于 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
以根据其格式化的日期执行加/减?
编写这个函数时,我最初的实现使用 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 点。