자바스크립트로 날짜 범위를 순환하기
두개가 주어졌어요Date()
하나가 다른 하나보다 적은 사물, 어떻게 날짜 사이를 매일 반복할 수 있습니까?
for(loopDate = startDate; loopDate < endDate; loopDate += 1)
{
}
이런 종류의 고리가 작동할까요?하지만 루프 카운터에 하루를 추가하려면 어떻게 해야 합니까?
감사합니다!
필요한 경우 날짜를 다음 달로 롤오버하고 밀리초를 낭비하지 않는 방법으로 하루를 추가하는 방법이 있습니다.일광 절약도 문제가 되지 않습니다.
var now = new Date();
var daysOfYear = [];
for (var d = new Date(2012, 0, 1); d <= now; d.setDate(d.getDate() + 1)) {
daysOfYear.push(new Date(d));
}
날짜를 저장하려면 새 날짜를 만들어야 합니다(위와 같이).new Date(d)
), 그렇지 않으면 저장된 모든 날짜가 최종 값이 됩니다.d
고리에
톰 귈렌의 대답을 토대로.
var start = new Date("02/05/2013");
var end = new Date("02/10/2013");
var loop = new Date(start);
while(loop <= end){
alert(loop);
var newDate = loop.setDate(loop.getDate() + 1);
loop = new Date(newDate);
}
Moment.js를 사용할 수 있다면 더 간단한 답을 찾은 것 같습니다.
// cycle through last five days, today included
// you could also cycle through any dates you want, mostly for
// making this snippet not time aware
const currentMoment = moment().subtract(4, 'days');
const endMoment = moment().add(1, 'days');
while (currentMoment.isBefore(endMoment, 'day')) {
console.log(`Loop at ${currentMoment.format('YYYY-MM-DD')}`);
currentMoment.add(1, 'days');
}
<script src="https://cdn.jsdelivr.net/npm/moment@2/moment.min.js"></script>
여기 간단한 작업 코드가 있어요, 저를 위해 일했죠.
var from = new Date(2012,0,1);
var to = new Date(2012,1,20);
// loop for every day
for (var day = from; day <= to; day.setDate(day.getDate() + 1)) {
// your day is here
console.log(day)
}
startDate 및 endDate가 실제로 날짜 개체인 경우 1970년 1월 1일 자정 이후 밀리초 단위로 변환할 수 있습니다.
var startTime = startDate.getTime(), endTime = endDate.getTime();
그런 다음 하나에서 다른 증분 루프로 루프할 수 있습니다.86400000(1000*60*60*24)까지의 시간 - 하루 중 밀리초 수:
for(loopTime = startTime; loopTime < endTime; loopTime += 86400000)
{
var loopDay=new Date(loopTime)
//use loopDay as you wish
}
var start = new Date("2014-05-01"); //yyyy-mm-dd
var end = new Date("2014-05-05"); //yyyy-mm-dd
while(start <= end){
var mm = ((start.getMonth()+1)>=10)?(start.getMonth()+1):'0'+(start.getMonth()+1);
var dd = ((start.getDate())>=10)? (start.getDate()) : '0' + (start.getDate());
var yyyy = start.getFullYear();
var date = dd+"/"+mm+"/"+yyyy; //yyyy-mm-dd
alert(date);
start = new Date(start.setDate(start.getDate() + 1)); //date increase by 1
}
함수로써,
function getDatesFromDateRange(from, to) {
const dates = [];
for (let date = from; date <= to; date.setDate(date.getDate() + 1)) {
const cloned = new Date(date.valueOf());
dates.push(cloned);
}
return dates;
}
const start = new Date(2019, 11, 31);
const end = new Date(2020, 1, 1);
const datesArray = getDatesFromDateRange(start, end);
console.dir(datesArray);
Tabare's Answer를 기준으로, 나는 마지막에 하루를 더 추가해야 했습니다, 왜냐하면 사이클이 전에 끊겼기 때문입니다.
var start = new Date("02/05/2013");
var end = new Date("02/10/2013");
var newend = end.setDate(end.getDate()+1);
var end = new Date(newend);
while(start < end){
alert(start);
var newDate = start.setDate(start.getDate() + 1);
start = new Date(newDate);
}
결과를 배열에 저장하고 싶지 않아서 수율을 사용하는 것이 어떨까요?
/**
* @param {object} params
* @param {Date} params.from
* @param {Date} params.to
* @param {number | undefined} params.incrementBy
* @yields {Date}
*/
function* iterateDate(params) {
const increaseBy = Math.abs(params.incrementBy ?? 1);
for(let current = params.from; current.getTime() <= params.to.getTime(); current.setDate(current.getDate() + increaseBy)) {
yield new Date(current);
}
}
for (const d of iterateDate({from: new Date(2021,0,1), to: new Date(2021,0,31), incrementBy: 1})) {
console.log(d.toISOString());
}
밀리초의 효율적인 방법을 원하는 경우:
var daysOfYear = [];
for (var d = begin; d <= end; d = d + 86400000) {
daysOfYear.push(new Date(d));
}
UI에서 시작일과 종료일을 가져와 컨트롤러의 스코프 변수에 저장했다고 가정해 보겠습니다.
그런 다음, 모든 함수 호출 시 재설정되는 배열을 선언하여 다음 함수 호출 시 새 데이터를 저장할 수 있도록 합니다.
vardayLabel = [];
새 날짜를 사용하지 않고 변수에 직접 할당하면 setDate 함수가 각 반복에서 원래 변수 값을 변경하기 때문에 새 날짜(시작 변수)를 사용해야 합니다.
for (var d = new Date($scope.startDate); d <= $scope.endDate; d.setDate(d.getDate() + 1)) {
dayLabel.push(new Date(d));
}
자야르호의 대답에 근거해서:
var loopDate = new Date();
loopDate.setTime(datFrom.valueOf());
while (loopDate.valueOf() < datTo.valueOf() + 86400000) {
alert(loopDay);
loopDate.setTime(loopDate.valueOf() + 86400000);
}
언급URL : https://stackoverflow.com/questions/4345045/loop-through-a-date-range-with-javascript
'source' 카테고리의 다른 글
MySQL 내부 조인 별칭 (0) | 2023.10.28 |
---|---|
파일 트랙터 테스트 케이스 다운로드 (0) | 2023.10.28 |
C# http webrequest and javascript (0) | 2023.10.28 |
반면 (1); C에 정의되지 않은 동작이 있습니까? (0) | 2023.10.28 |
MySQL 성능 최적화: datetime 필드별 순서 (0) | 2023.10.28 |