mojtaba sh
mojtaba sh

Reputation: 103

how can get particular day of date when you have start and end date

I have a start date 4/10/2021 and end date 4/12/2021

I want get Tuesday, Thursday and Friday date in jquery

I found this solution:

var x = new Date();
//set the financial year starting date
x.setFullYear(2021, 10, 04);

//set the next financial year starting date
var y = new Date();
y.setFullYear(2021, 12, 04);
var j = 1;
var count = 0;

//getting the all fridays in a financial year
for ( var i = 0; x<y; i += j) {
    if (x.getDay() == 5) {
       $("#append_text").append("Date : " + x.getDate() + "/"
                        + (x.getMonth() + 1) + "<br>");
       x = new Date(x.getTime() + (7 * 24 * 60 * 60 * 1000));
       j = 7;
       count++;
    } else {
       j = 1;
       x = new Date(x.getTime() + (24 * 60 * 60 * 1000));
    }
}
$("#append_text").append("total fridays : " + count + "<br>");

but it return only Friday and i think it doesn't work truly

The result is:

Date : 5/11
Date : 12/11
Date : 19/11
Date : 26/11
Date : 3/12
Date : 10/12
Date : 17/12
Date : 24/12
Date : 31/12
total fridays : 9

The solution link is here: Get Friday Dates of Year in javascript using jquery

do you have any solution for that?

Upvotes: 1

Views: 223

Answers (3)

RobG
RobG

Reputation: 147413

You can do this by iterating over every date between the two dates and saving the ones that fit some criterion, or you can get the first of the required dates, then add 7 days to get each weekly until the end date, e.g.

// Parse date in day/month/year format
function parseDMY(s) {
  let [d, m, y] = s.split(/\D/);
  return new Date(y, m-1, d);
}
// Get next day by dayNumber on or after date, default today
function getDayOfWeek(day, date) {
  let d = date? new Date(+date) :  new Date();
  d.setDate(d.getDate() - d.getDay() + day + 
    (day < d.getDay()? 7 : 0));
  return d;
}

// Format date as dd/mm/yyyy
function formatDMY(date) {
  return date.toLocaleString('en-GB', {
    year : 'numeric', // remove if year not required
    month: '2-digit',
    day  : '2-digit'
  });
}

// Given start and end date, get days by day number between
// dates inclusive
function getDaysBetweenDates(d0, d1, ...days){
  let dStart = parseDMY(d0);
  let dEnd   = parseDMY(d1);

  // Guard against endless loop
  if (dEnd < dStart) return;

  let dates = [];
  while (dStart <= dEnd) {
    days.forEach(day => {
      let d = getDayOfWeek(day, dStart);
      if (d <= dEnd) dates.push(formatDMY(d));
    });
    dStart.setDate(dStart.getDate() + 7);
  }
  return dates.sort(
    (a, b) => a.split(/\D/).reverse().join('').localeCompare(
              b.split(/\D/).reverse().join(''))
  );
}

// Get all Tue, Thu and Fri between 4 Oct 2021 and 4 Dec 2021 inclusive
console.log(getDaysBetweenDates('4/10/2021', '4/12/2021', 2, 4, 5));

I've left the year in the date, it's easily removed by removing year: 'numeric', from the formatting options.

Note that in the OP:

y.setFullYear(2021, 12, 04);

creates a Date for 4 Jan, 2022 not 4 Dec 2021 because months are zero indexed, so December is 11. A month value of 12 rolls over to January of the following year.

Upvotes: 0

codeandcloud
codeandcloud

Reputation: 55210

Try this.

var start = new Date(2021, 10, 04);
var end = new Date(2021, 12, 04);

var tuesdays = [], thursdays = [], fridays = [];


for (var current = start; current <= end; current.setDate(current.getDate() + 1)) {

  var day = current.getDay();
  switch (day) {
    case 2: // tuesdays
      tuesdays.push(formatDate(current));
      break;
    case 4: // thursdays
      thursdays.push(formatDate(current));
      break;
    case 6: // fridays
      fridays.push(formatDate(current));
      break;
    default: //other dates
      break;
  }
}

function formatDate(d) { // formats date to dd/mm/yyy
  return d.getDate() + '/' + (d.getMonth() + 1) + '/' + d.getFullYear();
}
console.log(tuesdays.length + " Tuesdays: ", tuesdays.join('\t'));
console.log(thursdays.length + " Thursdays: ", thursdays.join('\t'));
console.log(fridays.length + " Fridays: ", fridays.join('\t'));

Upvotes: 0

palaѕн
palaѕн

Reputation: 73906

As mentioned in getDay() docs:

The getDay() method returns the day of the week for the specified date according to local time, where 0 represents Sunday.

So, clearly

if (x.getDay() == 5)

5 here stands for Friday. So, if you also need Tuesday as 2 & Thursday as 4, you simply need to modify for loop like:

var day = x.getDay();
if (day === 2 || day === 4 || day === 5) 

Demo:

var x = new Date();
//set the financial year starting date
x.setFullYear(2021, 10, 04);

//set the next financial year starting date
var y = new Date();
y.setFullYear(2021, 12, 04);
var html = '';
var count = 0;

//getting the all fridays in a financial year
for (var i = 0; x < y; i++) {
  var day = x.getDay();
  if (day === 2 || day === 4 || day === 5) {
    html += "Date : " + x.getDate() + "/" + (x.getMonth() + 1) + "<br>";    
    if (day === 5)count++;
  }
  x.setDate(x.getDate() + 1)
}
$("#append_text").append(html);
$("#append_text").append("total fridays : " + count + "<br>");
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id=append_text></div>

Upvotes: 1

Related Questions