如何计算忽略目标时区和DST的四舍五入的月份和日期,直到目标日期?

时间:2018-10-04 11:30:24

标签: javascript date momentjs

我想创建一个计时器,以显示在本地目标日期之前剩余的月份和日期的四舍五入,而忽略时区和夏令时。

为了弄清楚,目标日期为2018-12-10

2018-10-08 23:01,它应导致2 months 2 days
2018-10-09 00:01,它应产生2 months 1 days
2018-10-09 02:01,它应产生2 months 1 days
2018-12-09 23:59,它应产生0 months 1 days

很明显,无论目标日期是否在本地时区的夏令时之后,日期都应始终在本地00:00开始和结束。

采用幼稚的方法,DST更改将其取消,并且也没有计算不到满天的时间:

const target = moment('2018-12-10')

const t1 = moment('2018-10-08 23:01')
const t2 = moment('2018-10-09 00:01')
const t3 = moment('2018-10-09 02:01')
const t4 = moment('2018-12-09 23:59')

const d1 = moment.duration(target.diff(t1))
const d2 = moment.duration(target.diff(t2))
const d3 = moment.duration(target.diff(t3))
const d4 = moment.duration(target.diff(t4))

// render() ...
{d1.months()} months {d1.days()} days
{d2.months()} months {d2.days()} days
{d3.months()} months {d3.days()} days
{d4.months()} months {d4.days()} days

导致:

2 months 1 days
2 months 1 days
2 months 0 days
0 months 0 days

在持续时间内不受DST变化影响的天数计算方法是正确的吗?

1 个答案:

答案 0 :(得分:2)

您可以使用startOf()首先将日期四舍五入。

因此,如果您执行以下操作:

const target = moment('2018-12-10')

const t1 = moment('2018-10-08 23:01').startOf('day');
const t2 = moment('2018-10-09 00:01').startOf('day');
const t3 = moment('2018-12-09 23:59').startOf('day');

const d1 = moment.duration(target.diff(t1))
const d2 = moment.duration(target.diff(t2))
const d3 = moment.duration(target.diff(t3))

console.log(d1.months() + " months " + d1.days() + " days");
console.log(d2.months() + " months " + d2.days() + " days");
console.log(d3.months() + " months " + d3.days() + " days");

结果将是:

2 months 2 days
2 months 1 days
0 months 1 days

您还可以使用isDST()来计算是否观察到DST。如果是这样,您将首先减去一个小时。用法可能看起来像这样:

let t1 = moment('2018-10-08 00:01');
t1 = t1.isDST() ? t1.subtract(1, 'hours').startOf('day') : t1.startOf('day');