Javascript - 두 날짜 사이의 날짜 배열 가져오기
var range = getDates(new Date(), new Date().addDays(7));
"range"는 두 날짜 사이에 매일 하나씩 날짜 객체의 배열로 지정합니다.
비결은 월과 연도의 경계도 처리해야 한다는 것입니다.
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
function getDates(startDate, stopDate) {
var dateArray = new Array();
var currentDate = startDate;
while (currentDate <= stopDate) {
dateArray.push(new Date (currentDate));
currentDate = currentDate.addDays(1);
}
return dateArray;
}
여기 기능 데모 http://jsfiddle.net/jfhartsock/cM3ZU/가 있습니다.
위에 있는 거 다 봤어요.결국엔 내가 직접 썼어.이 일에는 시간이 필요 없습니다.for 루프는 범위 내의 값을 카운트하기 위해 존재하기 때문에 native for 루프로 충분하며 가장 타당합니다.
라이너 1개:
var getDaysArray = function(s,e) {for(var a=[],d=new Date(s);d<=new Date(e);d.setDate(d.getDate()+1)){ a.push(new Date(d));}return a;};
롱 버전
var getDaysArray = function(start, end) {
for(var arr=[],dt=new Date(start); dt<=new Date(end); dt.setDate(dt.getDate()+1)){
arr.push(new Date(dt));
}
return arr;
};
날짜 표시 간격:
var daylist = getDaysArray(new Date("2018-05-01"),new Date("2018-07-01"));
daylist.map((v)=>v.toISOString().slice(0,10)).join("")
/*
Output:
"2018-05-01
2018-05-02
2018-05-03
...
2018-06-30
2018-07-01"
*/
과거 날짜부터 현재까지 일 수:
var daylist = getDaysArray(new Date("2018-05-01"),new Date());
daylist.map((v)=>v.toISOString().slice(0,10)).join("")
이것을 시도해 보세요. 잊지 말고 js 모멘트를 포함하세요.
function getDates(startDate, stopDate) {
var dateArray = [];
var currentDate = moment(startDate);
var stopDate = moment(stopDate);
while (currentDate <= stopDate) {
dateArray.push( moment(currentDate).format('YYYY-MM-DD') )
currentDate = moment(currentDate).add(1, 'days');
}
return dateArray;
}
나는 moment.js와 Twix.js를 사용한다.이것들은 날짜 및 시간 조작에 매우 큰 지원을 제공한다.
var itr = moment.twix(new Date('2012-01-15'),new Date('2012-01-20')).iterate("days");
var range=[];
while(itr.hasNext()){
range.push(itr.next().toDate())
}
console.log(range);
http://jsfiddle.net/Lkzg1bxb/에서 실행하고 있습니다.
var boxingDay = new Date("12/26/2010");
var nextWeek = boxingDay*1 + 7*24*3600*1000;
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) );
}
return d;
}
getDates( boxingDay, nextWeek ).join("\n");
// Sun Dec 26 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Mon Dec 27 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Tue Dec 28 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Wed Dec 29 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Thu Dec 30 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Fri Dec 31 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Sat Jan 01 2011 00:00:00 GMT-0700 (Mountain Standard Time)
위의 답변을 사용하는 데 어려움을 겪었습니다.로컬 Day Light Saving Time(DST; 일광 절약 시간)에 의한 시간대 이동으로 인해 날짜 범위가 1일 누락되었습니다.UTC 날짜를 사용하여 이 문제를 해결하는 버전을 구현했습니다.
function dateRange(startDate, endDate, steps = 1) {
const dateArray = [];
let currentDate = new Date(startDate);
while (currentDate <= new Date(endDate)) {
dateArray.push(new Date(currentDate));
// Use UTC date to prevent problems with time zones and DST
currentDate.setUTCDate(currentDate.getUTCDate() + steps);
}
return dateArray;
}
const dates = dateRange('2020-09-27', '2020-10-28');
console.log(dates);
주의: 특정 시간대 또는 DST 중 어느 것이 적용되는지는 전적으로 사용자의 로케일에 따라 달라집니다.이것을 덮어쓰는 것은 일반적으로 좋은 생각이 아니다.UTC 날짜를 사용하면 대부분의 시간 관련 문제가 완화됩니다.
보너스: 옵션에서 타임스탬프를 생성할 시간 간격을 설정할 수 있습니다.steps
파라미터를 지정합니다. 는,steps
로로 합니다.7
.
모멘트를 사용하고 있는 경우는, 범위에 대해서 「공식 플러그인」을 사용할 수 있습니다.그 후, 이것은 사소한 것이 됩니다.
모멘트 범위 노드의 예:
const Moment = require('moment');
const MomentRange = require('moment-range');
const moment = MomentRange.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')))
모멘트 범위 브라우저의 예:
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>
date fns의 예:
사용하고 있는 경우는, 그 친구가 가장 짧고 간결한 답변을 얻을 수 있습니다.
console.log(dateFns.eachDay(
new Date(2018, 11, 30),
new Date(2019, 30, 09)
))
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.29.0/date_fns.min.js"></script>
function (startDate, endDate, addFn, interval) {
addFn = addFn || Date.prototype.addDays;
interval = interval || 1;
var retVal = [];
var current = new Date(startDate);
while (current <= endDate) {
retVal.push(new Date(current));
current = addFn.call(current, interval);
}
return retVal;
}
ES6를 사용하면 Array.를 사용하여 동적 간격(시간, 일, 월)을 허용하는 매우 우아한 함수를 작성할 수 있습니다.
function getDates(startDate, endDate, interval) {
const duration = endDate - startDate;
const steps = duration / interval;
return Array.from({length: steps+1}, (v,i) => new Date(startDate.valueOf() + (interval * i)));
}
const startDate = new Date(2017,12,30);
const endDate = new Date(2018,1,3);
const dayInterval = 1000 * 60 * 60 * 24; // 1 day
const halfDayInterval = 1000 * 60 * 60 * 12; // 1/2 day
console.log("Days", getDates(startDate, endDate, dayInterval));
console.log("Half Days", getDates(startDate, endDate, halfDayInterval));
방금 이 질문을 받았습니다. 가장 쉬운 방법은 모멘트를 사용하는 것입니다.
먼저 모멘트 및 모멘트 범위를 설치해야 합니다.
const Moment = require('moment');
const MomentRange = require('moment-range');
const moment = MomentRange.extendMoment(Moment);
const start = moment()
const end = moment().add(2, 'months')
const range = moment.range(start, end)
const arrayOfDates = Array.from(range.by('days'))
console.log(arrayOfDates)
최근에 모멘트를 작업하고 있었는데, 팔로잉이 성공했어요
function getDateRange(startDate, endDate, dateFormat) {
var dates = [],
end = moment(endDate),
diff = endDate.diff(startDate, 'days');
if(!startDate.isValid() || !endDate.isValid() || diff <= 0) {
return;
}
for(var i = 0; i < diff; i++) {
dates.push(end.subtract(1,'d').format(dateFormat));
}
return dates;
};
console.log(getDateRange(startDate, endDate, dateFormat));
결과는 다음과 같습니다.
["09/03/2015", "10/03/2015", "11/03/2015", "12/03/2015", "13/03/2015", "14/03/2015", "15/03/2015", "16/03/2015", "17/03/2015", "18/03/2015"]
저는 한동안 @Mohammed Safer 솔루션을 사용하고 있는데 몇 가지 개선점을 두었습니다.컨트롤러에서 작업할 때 정형 날짜를 사용하는 것은 좋지 않은 방법입니다. moment().format()
뷰의 표시 목적으로만 사용해야 합니다.또 기억해 두시기 바랍니다.moment().clone()
는 입력 파라미터로부터의 분리를 보증합니다.즉, 입력일은 변경되지 않습니다.데이트할 때 moment.js를 사용하는 것이 좋습니다.
사용방법:
- 다음 값으로 mote.js 날짜를 지정합니다.
startDate
,endDate
파라미터 interval
파라미터는 옵션이며 기본값은 'days'입니다.지원되는 구간 사용.add()
method (162.199)자세한 내용은 이쪽total
parameter는 간격을 분 단위로 지정할 때 유용합니다.기본값은 1 입니다.
호출:
var startDate = moment(),
endDate = moment().add(1, 'days');
getDatesRangeArray(startDate, endDate, 'minutes', 30);
기능:
var getDatesRangeArray = function (startDate, endDate, interval, total) {
var config = {
interval: interval || 'days',
total: total || 1
},
dateArray = [],
currentDate = startDate.clone();
while (currentDate < endDate) {
dateArray.push(currentDate);
currentDate = currentDate.clone().add(config.total, config.interval);
}
return dateArray;
};
간단한 while loop을 사용하여 날짜를 계산하고 있습니다.
var start = new Date("01/05/2017");
var end = new Date("06/30/2017");
var newend = end.setDate(end.getDate()+1);
end = new Date(newend);
while(start < end){
console.log(new Date(start).getTime() / 1000); // unix timestamp format
console.log(start); // ISO Date format
var newDate = start.setDate(start.getDate() + 1);
start = new Date(newDate);
}
var listDate = [];
var startDate ='2017-02-01';
var endDate = '2017-02-10';
var dateMove = new Date(startDate);
var strDate = startDate;
while (strDate < endDate){
var strDate = dateMove.toISOString().slice(0,10);
listDate.push(strDate);
dateMove.setDate(dateMove.getDate()+1);
};
console.log(listDate);
//["2017-02-01", "2017-02-02", "2017-02-03", "2017-02-04", "2017-02-05", "2017-02-06", "2017-02-07", "2017-02-08", "2017-02-09", "2017-02-10"]
이 라이너에는 라이브러리가 필요 없습니다.다른 함수를 만들고 싶지 않습니다.startDate(2자리)와 endDate(js 날짜 객체)를 변수 또는 날짜 값으로 바꿉니다.물론 원하시면 함수로 포장하실 수 있습니다.
Array(Math.floor((endDate - startDate) / 86400000) + 1).fill().map((_, idx) => (new Date(startDate.getTime() + idx * 86400000)))
이 기능을 사용하고 있습니다.
function getDatesRange(startDate, stopDate) {
const ONE_DAY = 24*3600*1000;
var days= [];
var currentDate = new Date(startDate);
while (currentDate <= stopDate) {
days.push(new Date (currentDate));
currentDate = currentDate - 1 + 1 + ONE_DAY;
}
return days;
}
모멘트를 사용하여 쉽게 할 수 있습니다.JS
의존성에 모멘트를 더하다
npm i moment
그런 다음 파일을 가져오십시오.
var moment = require("moment");
다음 코드를 사용하여 두 날짜 사이의 모든 날짜 목록을 가져옵니다.
let dates = [];
let currDate = moment.utc(new Date("06/30/2019")).startOf("day");
let lastDate = moment.utc(new Date("07/30/2019")).startOf("day");
do {
dates.push(currDate.clone().toDate());
} while (currDate.add(1, "days").diff(lastDate) < 0);
dates.push(currDate.clone().toDate());
console.log(dates);
d3time은 많은 편리한 기능을 제공하며 날짜 조작이 용이한 d3.time을 포함합니다.
구체적인 요청:
UTC
var range = d3.utcDay.range(new Date(), d3.utcDay.offset(new Date(), 7));
또는 현지시간
var range = d3.timeDay.range(new Date(), d3.timeDay.offset(new Date(), 7));
range는 각 요일의 첫 번째 가능한 값에 해당하는 날짜 객체의 배열입니다.
시간을 변경할 수 있습니다.요일에서 시간으로다른 간격으로 동일한 결과에 대한 시간, 시간 월 등
@softvar의 솔루션(작업일 옵션 포함)
/**
* Returns array of working days between two dates.
*
* @param {string} startDate
* The start date in yyyy-mm-dd format.
* @param {string} endDate
* The end date in yyyy-mm-dd format.
* @param {boolean} onlyWorkingDays
* If true only working days are returned. Default: false
*
* @return {array}
* Array of dates in yyyy-mm-dd string format.
*/
function getDates(startDate, stopDate, onlyWorkingDays) {
let doWd = typeof onlyWorkingDays ==='undefined' ? false : onlyWorkingDays;
let dateArray = [];
let dayNr;
let runDateObj = moment(startDate);
let stopDateObj = moment(stopDate);
while (runDateObj <= stopDateObj) {
dayNr = runDateObj.day();
if (!doWd || (dayNr>0 && dayNr<6)) {
dateArray.push(moment(runDateObj).format('YYYY-MM-DD'));
}
runDateObj = moment(runDateObj).add(1, 'days');
}
return dateArray;
}
이렇게 하는 게 좋아
// hours * minutes * seconds * milliseconds
const DAY_IN_MS = 24 * 60 * 60 * 1000
/**
* Get range of dates
* @param {Date} startDate
* @param {Number} numOfDays
* @returns {array}
*/
const dateRange = (startDate, numOfDays) => {
const startDateMs = startDate.getTime()
// get array of days and map it to Date object
return [...Array(numOfDays).keys()].map(i => new Date(startDateMs + i * DAY_IN_MS))
}
Array(7).fill().map((_,i) => dayjs().subtract(i, "day").format("YYYY-MM-DD"));
최단 시간은 아니지만 쉽고, 불변하며, 의존성이 없음
function datesArray(start, end) {
let result = [], current = new Date(start);
while (current <= end)
result.push(current) && (current = new Date(current)) && current.setDate(current.getDate() + 1);
return result;
}
사용.
function datesArray(start, end) {
let result = [], current = new Date(start);
while (current <= end)
result.push(current) && (current = new Date(current)) && current.setDate(current.getDate() + 1);
return result;
}
// Usage
const test = datesArray(
new Date('2020-02-26'),
new Date('2020-03-05')
);
for (let i = 0; i < test.length; i ++ ) {
console.log(
test[i].toISOString().slice(0,10)
);
}
주의: 이 솔루션이 요청된 솔루션과 약간 다르다는 것은 알지만 많은 사람들이 이 솔루션이 유용하다고 생각합니다.
두 날짜 사이의 각 "x" 간격(일, 월, 연도 등)을 찾으려면 moment.js와 모멘트 범위 확장 패키지를 사용합니다.
예를 들어, 두 날짜 사이에서 각 30일째를 찾으려면:
window['moment-range'].extendMoment(moment);
var dateString = "2018-05-12 17:32:34.874-08";
var start = new Date(dateString);
var end = new Date();
var range1 = moment.range(start, end);
var arrayOfIntervalDates = Array.from(range1.by('day', { step: 30 }));
arrayOfIntervalDates.map(function(intervalDate){
console.log(intervalDate.format('YY-M-DD'))
});
연도 배열 생성:
const DAYS = () => { const days = [] const dateStart = moment() const dateEnd = moment().add(30, ‘days') while (dateEnd.diff(dateStart, ‘days') >= 0) { days.push(dateStart.format(‘D')) dateStart.add(1, ‘days') } return days } console.log(DAYS())
월별 어레이 생성:
const MONTHS = () => { const months = [] const dateStart = moment() const dateEnd = moment().add(12, ‘month') while (dateEnd.diff(dateStart, ‘months') >= 0) { months.push(dateStart.format(‘M')) dateStart.add(1, ‘month') } return months } console.log(MONTHS())
일 동안 어레이 생성:
const DAYS = () => { const days = [] const dateStart = moment() const dateEnd = moment().add(30, ‘days') while (dateEnd.diff(dateStart, ‘days') >= 0) { days.push(dateStart.format(‘D')) dateStart.add(1, ‘days') } return days } console.log(DAYS())
이것은 date-fns 라이브러리를 사용하는 또 다른 몇 줄의 솔루션입니다.
const { format, differenceInDays, addDays } = dateFns;
const getRangeDates = (startDate, endDate) => {
const days = differenceInDays(endDate, startDate);
console.log([...Array(days + 1).keys()].map((i) => format(addDays(startDate, i), 'YYYY-MM-DD')));
};
getRangeDates('2021-06-01', '2021-06-05');
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.js"></script>
이게 누군가에게 도움이 될 수도 있지만
여기서 행 출력을 가져와 row_date 객체의 형식을 원하는 대로 지정할 수 있습니다.
var from_date = '2016-01-01';
var to_date = '2016-02-20';
var dates = getDates(from_date, to_date);
console.log(dates);
function getDates(from_date, to_date) {
var current_date = new Date(from_date);
var end_date = new Date(to_date);
var getTimeDiff = Math.abs(current_date.getTime() - end_date.getTime());
var date_range = Math.ceil(getTimeDiff / (1000 * 3600 * 24)) + 1 ;
var weekday = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];
var months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"];
var dates = new Array();
for (var i = 0; i <= date_range; i++) {
var getDate, getMonth = '';
if(current_date.getDate() < 10) { getDate = ('0'+ current_date.getDate());}
else{getDate = current_date.getDate();}
if(current_date.getMonth() < 9) { getMonth = ('0'+ (current_date.getMonth()+1));}
else{getMonth = current_date.getMonth();}
var row_date = {day: getDate, month: getMonth, year: current_date.getFullYear()};
var fmt_date = {weekDay: weekday[current_date.getDay()], date: getDate, month: months[current_date.getMonth()]};
var is_weekend = false;
if (current_date.getDay() == 0 || current_date.getDay() == 6) {
is_weekend = true;
}
dates.push({row_date: row_date, fmt_date: fmt_date, is_weekend: is_weekend});
current_date.setDate(current_date.getDate() + 1);
}
return dates;
}
https://gist.github.com/pranid/3c78f36253cbbc6a41a859c5d718f362.js
다음은 Moment 날짜 또는 문자열 또는 혼합물을 입력으로 받아들이고 Moment 날짜로 날짜 배열을 생성하는 캔 메서드입니다.않을 , "모멘트 "를합니다.map()
메서드가 반환됩니다.
const moment = require('moment');
// ...
/**
* @param {string|import('moment').Moment} start
* @param {string|import('moment').Moment} end
* @returns {import('moment').Moment[]}
*/
const getDateRange = (start, end) => {
const s = moment.isMoment(start) ? start : moment(start);
const e = moment.isMoment(end) ? end : moment(end);
return [...Array(1 + e.diff(s, 'days')).keys()].map(n => moment(s).add(n, 'days'));
};
기능:
var dates = [],
currentDate = startDate,
addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
};
while (currentDate <= endDate) {
dates.push(currentDate);
currentDate = addDays.call(currentDate, 1);
}
return dates;
};
사용방법:
var dates = getDatesRange(new Date(2019,01,01), new Date(2019,01,25));
dates.forEach(function(date) {
console.log(date);
});
도움이 되길 바랍니다.
lodash & moment 사용:
const startDate = moment();
_.range(0, 7).map((d) => startDate.clone().add(d, 'day').toDate())
getDates = (from, to) => {
const cFrom = new Date(from);
const cTo = new Date(to);
let daysArr = [new Date(cFrom)];
let tempDate = cFrom;
while (tempDate < cTo) {
tempDate.setUTCDate(tempDate.getUTCDate() + 1);
daysArr.push(new Date(tempDate));
}
return daysArr;
}
언급URL : https://stackoverflow.com/questions/4413590/javascript-get-array-of-dates-between-2-dates
'programing' 카테고리의 다른 글
이전 달의 모든 행을 가져오기 위한 쿼리 (0) | 2023.01.10 |
---|---|
Double.parseDouble(null)과 Integer.parseInt(null)가 다른 예외를 발생시키는 이유는 무엇입니까? (0) | 2023.01.10 |
re.compile을 사용하지 않고 대소문자를 구분하지 않는 정규 표현식입니까? (0) | 2023.01.10 |
클래스 내의 함수를 호출하려면 어떻게 해야 합니까? (0) | 2023.01.10 |
spring-boot-starter-web을 사용하여 "허용 가능한 표현을 찾을 수 없습니다" (0) | 2023.01.10 |