使用angular7获取UTC时间中2个日期(fromDate和toDate)之间的日期列表

时间:2019-07-31 07:24:25

标签: javascript angular date utc

我已经尝试使用JavaScript获取两个日期之间的日期列表(我已经在GMT中实现了此功能)。

示例:

fromDate - 2019-08-27

toDate - 2019-08-30

日期列表

[2019-08-27, 2019-08-28, 2019-08-29, 2019-08-30]

我已经使用下面的JavaScript获得了这个数组

if(result.data.closurPeriods.length > 0) { 
    result.data.closurPeriods.forEach(closure => { 
        var start = closure.fromDate, //closure.fromDate = 2019-08-27
        end = new Date(closure.toDate), //closure.toDate = 2019-08-30
        currentDate = new Date(start);

        while (currentDate <= end) { 
            this.closurPeriods.push(this.datePipe.transform(new Date(currentDate), 'yyyy-MM-dd'));
            currentDate.setDate(currentDate.getDate() + 1);
        }
    });
}

以上JavaScript仅适用于GTMlocaltime(印度)。当我尝试在USA的日期列表数组中运行此脚本

[2019-08-28, 2019-08-28, 2019-08-29]

由于UTC不接受此脚本。

  

我的问题是如何解决UTC

中的上述脚本

2 个答案:

答案 0 :(得分:1)

2019-08-27被解析为UTC,但是 getDate setDate 是本地的。美国位于格林威治以西,因此new Date('2019-08-27')会产生一个本地日期为2019-08-26,加上一天就是2019-08-27。

对于任何具有负偏移量的时区,都会发生同样的事情。

一个简单的解决方法是使用所有UTC,例如:

function fillRange(start, end) {
  let result = [start];
  let a = new Date(start);
  let b = new Date(end);
  while (a < b) {
    a.setUTCDate(a.getUTCDate() + 1);
    result.push(a.toISOString().substr(0,10));
  }
  return result;
}

let from = '2019-08-27';
let to = '2019-08-30';
console.log(fillRange(from, to));

但是,我建议显式解析日期,而不要使用内置的解析器。一个简单的解析函数是2或3行代码,或者您可以使用许多解析和格式化库之一。

答案 1 :(得分:0)

最后我得到了解决方案

var start = new Date(closure.fromDate); // 2019-07-27
var end = new Date(closure.toDate); // 2019-07-31
var currentDate = start;

while (currentDate <= end) {
   //this.closurPeriods.push(this.datePipe.transform(new Date(currentDate), 'yyyy-MM-dd'));
   var date = new Date(currentDate);
   var datewithouttimezone = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
   this.closurPeriods.push(this.datePipe.transform(new Date(datewithouttimezone), 'yyyy-MM-dd'));
   currentDate.setDate(currentDate.getDate() + 1);
}

var start = new Date(closure.fromDate); // 2019-07-27
var end = new Date(closure.toDate); // 2019-07-31
var currentDate = start;

while (start < end) {
       start.setUTCDate(start.getUTCDate() + 1);
       this.closurPeriods.push(start.toISOString().substr(0, 10));
    }