Я пытаюсь отобразить дату последней среды в текущем месяце... так, чтобы она автоматически изменилась на правильную дату, когда наступает следующий месяц. (Поэтому вместо того, чтобы сказать: "Выполняя последнюю среду каждого месяца", я могу умело дать фактическую дату).
Например, я хочу, чтобы дата показывалась на веб-странице в среду, 25 сентября, в этом месяце, а затем появилась в среду, 30 октября следующего месяца.
Дополнительным решением для бонусов было бы, если бы я мог получить дату следующего месяца для отображения после прошлой даты. В моем примере выше, когда текущая дата - 26-30 сентября (любая дата после этой последней среды, но все же в том же месяце).. дата покажет следующую дату исполнения 30 октября.
Было бы здорово, если бы решение было через html, javascript/jquery или asp.
Спасибо, SunnyOz
Это зависит от ваших критериев "легко". Здесь простая функция для выполнения, как требуется, 5 строк рабочего кода, которые могут быть уменьшены до 4, но потеряют немного ясности, если это будет сделано:
function lastDayInMonth(dayName, month, year) {
// Day index map - modify to suit whatever you want to pass to the function
var dayNums = {Sunday: 0, Monday:1, Tuesday:2, Wednesday:3,
Thursday:4, Friday:5, Saturday:6};
// Create a date object for last day of month
var d = new Date(year, month, 0);
// Get day index, make Sunday 7 (could be combined with following line)
var day = d.getDay() || 7;
// Adjust to required day
d.setDate(d.getDate() - (7 - dayNums[dayName] + day) % 7);
return d;
}
Вы можете изменить карту на все, просто определите, что вы хотите передать функции (имя дня, аббревиатура, индекс, что угодно), которые можно сопоставить с номером дня ECMAScript.
Поэтому в случае, если вы всегда хотите показать последнюю среду месяца или следующего месяца, если она пройдет:
function showLastWed() {
var now = new Date();
var lastWedOfThisMonth = lastDayInMonth('Wednesday', now.getMonth()+1, now.getFullYear());
if (now.getDate() > lastWedOfThisMonth().getDate()) {
return lastDayInMonth('Wednesday', now.getMonth()+2, now.getFullYear());
} else {
return lastWedOfThisMonth;
}
}
Обратите внимание, что функция ожидает номер календарного месяца (Jan = 1, Feb = 2 и т.д.), Тогда как метод getMonth возвращает индекс месяца ECMAScript (Jan = 0, Feb = 1 и т.д.), Следовательно, +1
и +2
чтобы получить номер календарного месяца.
Вы можете использовать библиотеку javascript, такую как moment.js: http://momentjs.com/
а затем получить его с помощью этого:
moment().add('months', 1).date(1).subtract('days', 1).day(-4)
Вот подход в JS:
var monthLengths = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
function getLastWednesday() {
var d = new Date();
var month = d.getMonth();
var lastDay = monthLengths[month];
// mind leap years
if (month == 1) {
var year = d.getFullYear();
var isLeapYear = ((year % 4 == 0 && year % 100 > 0) || year % 400 == 0);
if (isLeapYear) lastDay++;
}
// get the weekday of last day in the curent mont
d.setDate(lastDay);
var weekday = d.getDay();
// calculate return value (wednesday is day 3)
if (weekday == 3) {
return lastDay;
}
else {
var offset = weekday - 3;
if (offset < 0) offset += 7;
return lastDay - offset;
}
}
Я предпочитаю использовать абстракцию как moment.js
как предлагал @Aralo. Однако, чтобы сделать это в сыром JavaScript, вы можете использовать некоторый код, подобный этому... создать функцию, которая получает все дни в месяц. Затем переверните список, чтобы найти последний номер дня. Среда - 3
.
function getDaysInMonth(date) {
var dayCursor = new Date(today.getFullYear(), today.getMonth()); // first day of month
var daysInMonth = [];
while(dayCursor.getMonth() == date.getMonth()) {
daysInMonth.push(new Date(dayCursor));
dayCursor.setDate(dayCursor.getDate() + 1);
}
return daysInMonth;
}
function findLastDay(date, dayNumber) {
var daysInMonth = getDaysInMonth(date);
for(var i = daysInMonth.length - 1; i >= 0; i--) {
var day = daysInMonth[i];
if(day.getDay() === dayNumber) return day;
}
}
Затем, чтобы получить последнюю среду в текущем месяце:
var today = new Date();
var lastWednesday = findLastDay(today, 3);