Есть ли простой способ найти последнюю дату дня недели в текущем месяце?

0

Я пытаюсь отобразить дату последней среды в текущем месяце... так, чтобы она автоматически изменилась на правильную дату, когда наступает следующий месяц. (Поэтому вместо того, чтобы сказать: "Выполняя последнюю среду каждого месяца", я могу умело дать фактическую дату).

Например, я хочу, чтобы дата показывалась на веб-странице в среду, 25 сентября, в этом месяце, а затем появилась в среду, 30 октября следующего месяца.

Дополнительным решением для бонусов было бы, если бы я мог получить дату следующего месяца для отображения после прошлой даты. В моем примере выше, когда текущая дата - 26-30 сентября (любая дата после этой последней среды, но все же в том же месяце).. дата покажет следующую дату исполнения 30 октября.

Было бы здорово, если бы решение было через html, javascript/jquery или asp.

Спасибо, SunnyOz

Теги:
asp-classic
dayofweek

4 ответа

1
Лучший ответ

Это зависит от ваших критериев "легко". Здесь простая функция для выполнения, как требуется, 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 чтобы получить номер календарного месяца.

  • 0
    Большое спасибо за добавление дополнительного раздела для удовлетворения моего второго запроса об использовании следующего месяца, если дата уже прошла в этом месяце. Мне пришлось немного подправить, чтобы он отображался так, как мне нужно ... но в остальном он работал как шарм!
0

Вы можете использовать библиотеку javascript, такую как moment.js: http://momentjs.com/

а затем получить его с помощью этого:

moment().add('months', 1).date(1).subtract('days', 1).day(-4)
  • 0
    Это звучит замечательно .. Я пытаюсь использовать его в теге сценария для отображения следующим образом: document.write (moment (). Add ('months', 1) .date (1) .subtract ('days', 1) .day (-4)) ;, но это дает мне следующие результаты: Ср 25 сентября 2013 13:39:01 GMT + 1000 - я хотел бы только 25 сентября. Я думаю, что момент позволяет мне отформатировать его, используя «MMM Do», но я не могу понять, как заставить его работать с приведенным выше кодом скрипта. Вы можете помочь?
  • 0
    Вы должны прочитать документацию
0

Вот подход в 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;
  }
}
  • 0
    Смотрите мой ответ о том, как создать объект даты для последнего дня месяца, это немного проще, чем выше. :-)
  • 0
    Не так много: дополнительная часть - високосный год. Но остальное было бы почти таким же (в символах), если бы оно было написано более компактно (но мы хотим научить алгоритм здесь). ;-)
Показать ещё 2 комментария
0

Я предпочитаю использовать абстракцию как 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню