我正在尝试创建两个日期之间的日期数组。
[11/16/2018, 12/16/2018, 1/16/2019......11/16/2019]
我有以下代码。
function dateRange(stDate, etDate) {
const dates = [];
var startDate = moment(new Date(stDate)).format("MM/DD/YYYY");
var endDate = moment(new Date(etDate)).format("MM/DD/YYYY");
var now = new Date(startDate);
while (startDate <= endDate) {
dates.push(new Date(now));
now = now.addMonths(1);
}
console.log("dateRange " + dates);
}
function RunLedgerAndPV() {
var stDate = "11/16/2018";
var etDate = "11/16/2019";
dateRange(stDate, etDate);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
尝试调试它,它不会中断或发生任何事情,它仅返回开始和结束日期,但不会推送日期数组。我在这里做什么错了?
此外,我还查看了与此相关的其他帖子,并且我自己过去从事日期范围方面的工作。但是,我不知道为什么这对我不起作用。
感谢您的帮助。谢谢!
答案 0 :(得分:0)
for (var i=0; now <= endDate; i++) {
dates.push(new Date(now));
now = now.addMonths(1);
}
您实例化并使用i
来使内容无循环。条件now <= endDate
绝不受i
的值的影响(通常,您递增/递减i
直到达到所需的值,如:var i=0; i < 11; i++
)我不知道如何运作,我的第一个直觉是它将生成一个循环,直到我们到达那个endDate
日期为止。
您似乎正在寻找获取特定范围内所有日期的方法,请尝试以下操作:
var enumerateDaysBetweenDates = function(startDate, endDate) {
var dates = [];
var currDate = moment(startDate, 'MM/DD/YYYY');;
var lastDate = moment(endDate, 'MM/DD/YYYY');;
while(currDate.add(1, 'months').diff(lastDate) < 0) {
console.log(currDate.toDate());
dates.push(currDate.clone().toDate());
}
return dates;
};
答案 1 :(得分:0)
您的代码中有很多低效率和错误,实在太多了。摘要将包括不必要的创建,然后重新对日期进行字符串化,不必要地使用JS Date构造函数以及for循环中的狡猾逻辑。
这是一个仅使用momentJS功能即可正常工作的版本:
function createLedger(stDate, etDate) {
if (stDate && etDate) {
var endOfLeaseDate = moment(etDate, "MM/DD/YYYY");
var startOfLeaseDate = moment(stDate, "MM/DD/YYYY");
dateRange(startOfLeaseDate, endOfLeaseDate);
}
}
function dateRange(stDate, etDate) {
var dates = [];
var now = stDate.clone();
var day = stDate.date();
while(now.isBefore(etDate)) {
//deal with variable month end days
var monthEnd = now.clone().endOf("month");
if (now.date() < day && day <= monthEnd.date()) { now.date(day); }
dates.push(now.format("YYYY-MM-DD"));
now = now.clone().add({ "months" : 1 });
}
console.log(dates);
}
function RunLedgerAndPV() {
var stDate = "12/31/2018";
var etDate = "12/31/2019";
createLedger(stDate, etDate);
}
RunLedgerAndPV();
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>