我尝试创建两天之间的天数列表。
我创建了这样的解决方案:
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
答案 0 :(得分:4)
@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)));