【问题标题】:Get dates list between 2 dates (fromDate and toDate) in utc time using angular7使用angular7获取UTC时间中2个日期(fromDate和toDate)之间的日期列表
【发布时间】:2019-07-31 07:24:25
【问题描述】:

我尝试使用 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 中解决上述脚本

【问题讨论】:

  • 没有与此问题相关的 jQuery 或 Angular。它是纯 JavaScript
  • @mplungjan:是的,你是对的。你能告诉我如何为UTC 解决这个JavaScript 吗?
  • 我有点鲁莽。 datePipe.transform是角
  • 我建议使用像 Luxon/Moment 这样的 DateTime 库以 UTC 创建 DateTime 对象。
  • @DrewReese:是的,我使用过moment.twix 链接jsfiddle.net/Lkzg1bxb。但我得到了 twix not found 之类的错误

标签: javascript angular date utc


【解决方案1】:

2019-08-27 被解析为 UTC,但 getDatesetDate 是本地的。美国位于格林威治以西,因此 new Date('2019-08-27') 生成的本地日期为 2019 年 8 月 26 日,加上一天则为 2019 年 8 月 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 行代码,或者您可以使用许多解析和格式化库之一。

【讨论】:

    【解决方案2】:

    终于找到解决办法了

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

    【讨论】:

      猜你喜欢
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多