使用简化方法在两个给定日期之间生成一系列日期
Posted
技术标签:
【中文标题】使用简化方法在两个给定日期之间生成一系列日期【英文标题】:Generating series of dates between two given date with simplified method [duplicate] 【发布时间】:2019-09-11 05:10:58 【问题描述】:我需要生成两个给定日期之间的所有日期系列。我怎么无法获得欲望输出。
我尝试使用以下代码。我 gt 一个空数组。
function getDates(startDate, endDate)
var dates = [];
var currentDate = new Date(startDate);
while (currentDate <= endDate)
var final = currentDate.getFullYear() + '-' + (((currentDate.getMonth() + 1) < 10) ? '0' : '') + (currentDate.getMonth() + 1) + '-' + ((currentDate.getDate() < 10) ? '0' : '') + currentDate.getDate();
dates.push(final);
currentDate = currentDate.setDate(currentDate.getDate() + 1);
return dates;
;
当我执行console.log(getDates("2019-10-10","2019-11-20"))
时,我得到的结果是空数组。结果,我没有得到这一系列日期。
【问题讨论】:
您正在将日期对象与您的 while 中的字符串进行比较。 抱歉,你没有得到我得到的错误,因为我没有意识到你错误地调用了你的函数——一旦你修复了它,你就会得到一个错误 糟糕,我会检查的。 【参考方案1】:正如@RobG 所说,解析日期可以yield different results 因此考虑使用以下内容:
function parseDate(input)
var parts = input.split('-');
return new Date(parts[0], parts[1] - 1, parts[2]);
function getDates(startDate, endDate)
var dates = [];
var currentDate = parseDate(startDate);
endDate = parseDate(endDate);
while (currentDate <= endDate)
var final = currentDate.getFullYear() + '-' + (((currentDate.getMonth() + 1) < 10) ? '0' : '') + (currentDate.getMonth() + 1) + '-' + ((currentDate.getDate() < 10) ? '0' : '') + currentDate.getDate();
dates.push(final);
currentDate.setDate(currentDate.getDate() + 1);
return dates;
console.log(getDates("2019-10-10", "2019-11-20"));
原答案:
您可以将endDate
更改为Date
类型,而不是设置currentDate
,因为setDate
正在为您执行此操作:
function getDates(startDate, endDate)
var dates = [];
var currentDate = new Date(startDate);
endDate = new Date(endDate);
while (currentDate <= endDate)
var final = currentDate.getFullYear() + '-' + (((currentDate.getMonth() + 1) < 10) ? '0' : '') + (currentDate.getMonth() + 1) + '-' + ((currentDate.getDate() < 10) ? '0' : '') + currentDate.getDate();
dates.push(final);
currentDate.setDate(currentDate.getDate() + 1);
return dates;
console.log(getDates("2019-10-10", "2019-11-20"));
【讨论】:
它按预期工作。谢谢。 很高兴它有帮助:) 请注意,“2019-10-10”被解析为 UTC,但您使用本地方法来格式化日期字符串。因此,对于格林威治以西的用户,“2019-10-10”将产生“2019-10-09”的“最终”日期。见Why does Date.parse give incorrect results?【参考方案2】:你必须在第 8 行调用 new Date()。
function getDates(startDate, endDate)
const dates = [];
let currentDate = new Date(startDate);
while (currentDate <= new Date(endDate))
const final = currentDate.getFullYear() + '-' + (((currentDate.getMonth() + 1) < 10) ? '0' : '') + (currentDate.getMonth() + 1) + '-' + ((currentDate.getDate() < 10) ? '0' : '') + currentDate.getDate();
dates.push(final);
currentDate = new Date(currentDate.setMonth(currentDate.getMonth()+1))
return dates;
;
const dates = getDates("2019-01-01", "2019-10-01");
console.log(dates);
【讨论】:
【参考方案3】:正如其他人所说,您正在比较一个字符串和一个日期,所以事情会出错。
ISO 8601 格式的日期可以作为字符串进行比较,而无需解析为日期。 YYY-MM-DD 格式的时间戳被解析为 UTC,因此您需要小心操作它们。在 OP 中,字符串被解析为 UTC,但使用本地方法来格式化时间戳,因此格林威治以西的用户可能会在 1 天后失效。
一种选择是使用 UTC 方法来增加日期并创建字符串进行比较,例如
// startDate, endDate in format YYYY-MM-DD
function getDates(startDate, endDate)
let toISODate = date => date.toISOString().substr(0,10);
var dates = [];
var currentDate = new Date(startDate);
while (startDate <= endDate)
dates.push(startDate);
currentDate.setUTCDate(currentDate.getUTCDate() + 1);
startDate = toISODate(currentDate);
return dates;
;
console.log(getDates('2019-09-01', '2019-10-01'));
【讨论】:
【参考方案4】:使用moment.js 之类的库进行日期操作。这些功能在这些中很容易获得。
window['moment-range'].extendMoment(moment);
const start = new Date("11/30/2018"), end = new Date("09/30/2019")
const range = moment.range(moment(start), moment(end));
console.log(Array.from(range.by('day')))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-range/4.0.1/moment-range.js"></script>
这个问题有很多其他方法作为答案 - 我从中复制了上述解决方案。
【讨论】:
以上是关于使用简化方法在两个给定日期之间生成一系列日期的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 datepicker、ajax、php、mysql 在两个日期之间生成报告?