我已经尝试使用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仅适用于GTM
和localtime
(印度)。当我尝试在USA
的日期列表数组中运行此脚本
[2019-08-28, 2019-08-28, 2019-08-29]
由于UTC不接受此脚本。
我的问题是如何解决
中的上述脚本UTC
答案 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));
}