打字稿中两个日期之间的天数列表

时间:2018-08-20 08:13:53

标签: javascript typescript date

我尝试创建两天之间的天数列表。

我创建了这样的解决方案:

this.daysBetween = [];
while (dateFrom.getDate() !== dateTo.getDate()+1 ) {
    this.daysBetween.push(this.dateFrom);
    dateFrom.setDate(dateFrom.getDate()+1);
  }

但是它仅在90%的情况下有效(如果有月份更改,则不起作用)

例如当我选择日期时:

dateFrom: 29 august
dateTo: 30 august 

它从29 august till 30 september ignoring 31 august ...起打印出我的天数

关于如何解决我的解决方案的任何想法,或者也许有更好的解决方案?

编辑:

我的问题与建议的问题不同,因为在我的问题中,我有两个日期作为输入

例如

let dateFrom = new Date(2018, 9, 29);
let dateTo = new Date(2018, 9, 30);

关于此建议的重复结果,可能是整数1

我的问题是如何遍历两个日期(dateFrom, dateTo)

这两个日期示例(dateFrom, dateTo)的结果将包含两个元素:

Mon Oct 29 2018 00:00:00 GMT+0100
Tue Oct 30 2018 00:00:00 GMT+0100 

3 个答案:

答案 0 :(得分:4)

简单的打字稿解决方案如下

Javascript version on Github

@foreach

答案 1 :(得分:3)

您可以使用moment's duration

/**
 * Get an array of moment instances, each representing a day beween given timestamps.
 * @param {string|Date} from start date 
 * @param {string|Date} to end date
 */
function daysBetween(from, to) {
  const fromDate = moment(new Date(from)).startOf('day');
  const toDate = moment(new Date(to)).endOf('day');

  const span = moment.duration(toDate.diff(fromDate)).asDays();
  const days = [];
  for (let i = 0; i <= span; i++) {
    days.push(moment(fromDate).add(i, 'day').startOf('day'));
  }
  return days;
}

const days = daysBetween('29-Aug-2018', '30-Sep-2018');

console.info(days.map(d => d.toString()).join('\n'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

您可以更改循环的开始/结束条件,以包括/排除第一天/最后一天。

答案 2 :(得分:2)

您可以计算出以毫秒为单位的差异,然后将其转换为以天为单位的差异。

然后您可以使用它用Date对象填充数组:

const MS_PER_DAY: number = 1000 x 60 x 60 x 24;
const start: number = dateFrom.getTime();
const end: number = dateTo.getTime();
const daysBetweenDates: number = Math.ceil((end - start) / MS_PER_DAY);

// The days array will contain a Date object for each day between dates (inclusive)
const days: Date[] = Array.from(new Array(daysBetweenDates + 1), 
    (v, i) => new Date(start + (i * MS_PER_DAY)));