Javascript 忽略时区和DST,如何计算截至目标日期的四舍五入月份和天数?
我想创建一个计时器,它显示在本地目标日期之前的月份和天数,忽略时区和夏令时 为了澄清,目标日期为2018年12月10日: 在Javascript 忽略时区和DST,如何计算截至目标日期的四舍五入月份和天数?,javascript,date,momentjs,Javascript,Date,Momentjs,我想创建一个计时器,它显示在本地目标日期之前的月份和天数,忽略时区和夏令时 为了澄清,目标日期为2018年12月10日: 在2018-10-08 23:01这将导致2个月2天 在2018-10-09 00:01这将导致2个月1天 在2018-10-09 02:01这将导致2个月1天 在2018-12-09 23:59时应导致0个月1天 显然,天数应始终在当地时间00:00开始和结束,无论目标日期是否在当地时区的DST更改之后 使用天真的方法,DST更改会将其丢弃,并且它也不会计算不到完整的天数:
2018-10-08 23:01
这将导致2个月2天
在
2018-10-09 00:01
这将导致2个月1天
在
2018-10-09 02:01
这将导致2个月1天
在
2018-12-09 23:59时
应导致0个月1天
显然,天数应始终在当地时间00:00
开始和结束,无论目标日期是否在当地时区的DST更改之后
使用天真的方法,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变化影响的情况下,计算天数的正确方法是什么?您可以先使用此方法将日期向下舍入
所以,如果你这样做:
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");
let t1 = moment('2018-10-08 00:01');
t1 = t1.isDST() ? t1.subtract(1, 'hours').startOf('day') : t1.startOf('day');
结果将是:
2 months 2 days
2 months 1 days
0 months 1 days
您还可以使用计算是否观察到DST。如果是,你会先减去一个小时。用法可能如下所示:
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");
let t1 = moment('2018-10-08 00:01');
t1 = t1.isDST() ? t1.subtract(1, 'hours').startOf('day') : t1.startOf('day');