目标:
在javascript中使用"\n"
打印日期2018-01-09至2018-02-08。
问题:
在i = 24之后,日期在"\r\n"
中添加月份,不知道为什么。
演示:
date function
感谢任何帮助。
答案 0 :(得分:2)
根据setDate
(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate)的文档,当传递给setDate
的值超过当月的日期时,日期会更新为好月份。< / p>
所以,你不应该增加一个递增的值,但你应该像这样增加一天的数字(&#34;逐个&#34;):
var date = new Date('2018-01-09');
console.log('date', date);
for (var i = 0; i < 30; i++) {
console.log('->', i);
date.setDate(date.getDate() + 1);
console.log('date', date);
trueDate = date.toISOString().substr(0, 10);
console.log(trueDate);
}
&#13;
答案 1 :(得分:1)
您每次可以在日期中添加1000*60*60*24
毫秒:
var date = new Date('2018-01-09');
console.log('date', date);
for (var i = 0; i < 30; i++) {
console.log(new Date(+date + (1000 * 60 * 60 * 24) * (i+1)));
}
答案 2 :(得分:1)
它正在添加月份,因为您在date22中设置了date11.getDate()+ i。由于date11.getDate()为9而i为24,因此总数变为33,大于该月的天数。这就是它增加月份字段的原因。 你的逻辑应如下:
var date22 = new Date('2018-01-09');
for (var i = 0; i < 30; i++) {
console.log('->', i);
date22.setDate(date22.getDate() + 1);
console.log('date22', date22);
trueDate = date22.toISOString().substr(0, 10);
console.log(trueDate);
}
答案 3 :(得分:1)
我不建议使用字符串操作来执行Date
计算。字符串操作会对数据的一致性承担全部责任(例如跟踪月中的日期,夏令时等)。
我建议在Date
个对象中使用内部毫秒计数器,并尽可能使用Date
方法构建迭代。
以下是查找两个已知日期之间所有日期的示例:
var getDatesBetween = (function() {
//Milliseconds in a day
var day = 86400000;
return function getDatesBetween(fromDate, toDate) {
//Check for invalid parameters
if (fromDate === void 0 ? true : fromDate instanceof Date === false ||
toDate === void 0 ? true : toDate instanceof Date === false) {
//Log an error
console.error("Invalid parameters");
//Return and empty list
return [];
}
//Create local date variables to leave original pristine
//We always put the smallest Date in "from" for consistency
var from = new Date((fromDate.getTime() < toDate.getTime() ? fromDate : toDate).getTime());
var to = new Date((fromDate.getTime() < toDate.getTime() ? toDate : fromDate).getTime());
//Set all data below day to a standardized level
from.setHours(12, 0, 0, 0);
to.setHours(12, 0, 0, 0);
//Return array
var returner = [];
//Offset "from" until it is greater than "to"
while (from.setTime(from.getTime() + day) && from.getTime() < to.getTime()) {
//Add this day to the return array
returner.push(new Date(from.getTime()));
}
//Return results
return returner;
};
})();
//TEST (with mapping example)
var from = new Date("2018-01-09");
var to = new Date("2018-02-08");
console.log({
from: from.toDateString(),
'datesBetween': getDatesBetween(from, to)
.map(function(date) {
return date.toDateString();
}),
to: to.toDateString()
});
答案 4 :(得分:0)
这一天正在进入下个月。以下是正在发生的事情的简单版本:
var d = new Date('2018-01-31'); // last day in January
d.setDate(32); // set date to: d.getDate() + 1 which equals 32
console.log(d); // 2018-02-01T00:00:00.000Z or 1st Feb
答案 5 :(得分:0)
你可以使用以下功能进入一个阵列
var date11 = new Date('2018-01-09');
var date22 = new Date('2018-02-08');
function getDates(d1, d2) {
var oneDay = 24 * 3600 * 1000;
for (var d = [], ms = d1 * 1, last = d2 * 1; ms < last; ms +=
oneDay)
{
d.push(new Date(ms).toISOString().substr(0, 10));
}
return d;
}
getDates( date11, date22 )
答案 6 :(得分:0)
问题在于,对于循环的每次迭代,您都会直接改变date22的状态。因此,您将对每个后续循环产生累积影响,因此遇到了溢出本月天数的问题(正如其他海报所指出的那样)。
var date11 = new Date('2018-01-09');
console.log('date11', date11);
for (var i = 0; i < 30; i++) {
console.log('->', i);
var dateToPrint = new Date(date11.getTime());
dateToPrint.setDate(dateToPrint.getDate() + i);
var trueDate = dateToPrint.toISOString().substr(0, 10);
console.log(trueDate);
}
上述解决方案使用在每个循环上重新创建的日期变量。这样,每个循环都不会产生副作用。