Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 忽略时区和DST,如何计算截至目标日期的四舍五入月份和天数?_Javascript_Date_Momentjs - Fatal编程技术网

Javascript 忽略时区和DST,如何计算截至目标日期的四舍五入月份和天数?

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年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更改会将其丢弃,并且它也不会计算不到完整的天数:

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');