我想创建一个计时器,以显示在本地目标日期之前剩余的月份和日期的四舍五入,而忽略时区和夏令时。
为了弄清楚,目标日期为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变化影响的天数计算方法是正确的吗?
答案 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');