0

我正在尝试显示当月最后一个星期三的日期......以便在下个月发生时它会自动更改为正确的日期。(所以不必说:“执行每个月的最后一个星期三”,我可以动态地给出实际日期。)

例如,我希望该日期在网页上显示为本月的 ​​9 月 25 日星期三,然后在下个月显示为 10 月 30 日星期三。

一个额外的解决方案是,如果我可以在上一个日期过去之后显示下个月的日期。在我上面的例子中,当当前日期是 9 月 26 日至 30 日(最后一个星期三之后的任何日期,但仍在同一个月内).. 日期将显示下一个执行日期 10 月 30 日。

如果解决方案是通过 html、javascript/jquery 或 asp,那就太好了。

谢谢, SunnyOz

4

4 回答 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 等),因此+1and+2获取日历月份数字。

于 2013-09-25T05:06:54.020 回答
0

您可以使用 javascript 库,例如 moment.js: http ://momentjs.com/

然后用这个得到它:

moment().add('months', 1).date(1).subtract('days', 1).day(-4)
于 2013-09-25T02:15:46.387 回答
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);
于 2013-09-25T02:26:30.960 回答
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;
  }
}
于 2013-09-25T02:26:45.363 回答