JavaScript:获取给定日期(月/年)的星期几名称数组

6
如何以每日名称的形式获取给定月份/年份的整个月份? 例如:
var year = "2000";
var month = "7"

... some code here that makes an array with names of days of the given month...

输出结果大致如下:

Array ("1. Sunday", "2. Monday", "3. Tuesday", ... "29. Thursday", "30. Friday", "31. Saturday");

最好的问候, 克里斯

这不是一个“JavaScript”问题,而是一个“我想要使用哪个日期API”的问题。一旦找到了一个能够确定特定年份和月份中每周的日期的API,JavaScript部分就非常容易了。 - natlee75
你期望这个日期(Saturday)的输出是什么? - user1432124
算了,这应该不难...太晚了,我想不清楚 :-) - natlee75
6个回答

12

这应该可以满足你的要求。

function getDaysArray(year, month) {
    var numDaysInMonth, daysInWeek, daysIndex, index, i, l, daysArray;

    numDaysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    daysInWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    daysIndex = { 'Sun': 0, 'Mon': 1, 'Tue': 2, 'Wed': 3, 'Thu': 4, 'Fri': 5, 'Sat': 6 };
    index = daysIndex[(new Date(year, month - 1, 1)).toString().split(' ')[0]];
    daysArray = [];

    for (i = 0, l = numDaysInMonth[month - 1]; i < l; i++) {
        daysArray.push((i + 1) + '. ' + daysInWeek[index++]);
        if (index == 7) index = 0;
    }

    return daysArray;
}

如果您希望我添加注释以解释每个步骤的操作,请告诉我,我会编辑帖子。 - natlee75
假设我想从人员数组中随机抽取“4个人名”,并在每个月的每一天分配它们,应该怎么做?另外,如何从工作人员数组中创建整个月的自动化工作班次? 感谢您可能提供的答案。 - sundsx

2

试试这个

<!DOCTYPE html>
<html>
<body>

<p id="demo">Click the button to display todays day of the week.</p>

<button onclick="myFunction()">Try it</button>

<script type="text/javascript">
function daysInMonth(month,year) {
    return new Date(year, month, 0).getDate();
}

function myFunction()
{var b=[],weekday = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],month=7,year=2000;
for(var i=1,l=daysInMonth(month,year);i<l;i++){
var d = new Date(year,month-1,i);
b.push(i+"."+weekday[d.getDay()]);
}
console.log(b);}//b is the desired array
</script>

</body>
</html>

需要注意的是,在您的 myFunction() 中,month 是基于1的,而不是基于0的;这是您实现 daysInMonth 函数正常工作的唯一方式。这可能会导致混淆,因为 JavaScript 的 Date 对象使用基于0的月份值。 - jackwanders
不,月份是从零开始计数的。请参见https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date。 - scottheckel
另外,在你的 weekday 数组中使用 new Array 是低效的,最好使用 weekday = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六']。此外,在每次 for 循环迭代中重新创建数组是没有必要的。 - jackwanders
@随机 - 在每次迭代 for 循环时调用 daysInMonth 是极其低效的。类似于 for (var i = 1, l = daysInMonth(month, year); i < l; i++) 的做法更好,因为 for 循环的第二个“段”中的代码会在每次循环迭代中被调用。 - natlee75
@Random - jackwanders关于new Array调用是正确的。奇怪的是你在那里使用了它,因为你只在几行之前以正确的方式初始化了b。从一开始定义整个数组是最有效的方法,但即使声明一个空数组,然后将每个星期推入其中也会更有效率。 - natlee75
@Random - 既然你已经知道了年、月和日(i),你可以跳过在 month+"/"+i+"/"+year 中创建字符串,直接将这三个值传递到 Date 构造函数中:Date(year, month, i)。无论如何,你应该从 month 中减去1,因为月份是从0开始计算的(所以7月应该是6,而不是7)。 - natlee75

0

我知道这是一个老问题,但今天一个问题链接到了这里,我想指出的是,除了将day (0-6)转换为string (Sunday-Saturday)之外,实际上不需要做太多事情。

function getDays(year, month) { //month: 1-based, as normal person
    --month //change it to 0-based, as Date object
    let dayname = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
    let date = new Date(year, month)
    let result = []
    while(date.getMonth()==month){
      result.push(`${date.getDate()}. ${dayname[date.getDay()]}`)
      date.setDate(date.getDate()+1)
    }
    return result;
}

console.log(getDays(2019,12))


0

0

您可以使用标准的JavaScript Date对象轻松地自己编写逻辑。以下是一个示例,获取一个日期并将其推入数组中。只需循环遍历整个月份调用该方法即可。(jsFiddle

var daysOfTheWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];

function getDisplay(month, day, year) {
    var d = new Date(year, month-1, day);
    return day + '. ' + daysOfTheWeek[d.getDay()];
}

array_push($dates, getDisplay(7, 4, 2012));

我认为应该有 month+1 - xkeshav
不,月份是从零开始计算的。一月是零。这就是为什么我在那个函数中交换了它,以便与他的变量对应。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date - scottheckel
这就是为什么如果用户输入七月(7),那么 JavaScript 应该将其解释为 6 - xkeshav
是的,这就是为什么我在 getDisplay() 函数中从月份中减去 1 的原因。 - scottheckel

0

尝试这个并在控制台中查看结果。

<script>
var weekday = ['Sunday', 'Monday', 'Tuesday', 'Wednesday',
               'Thursday', 'Friday', 'Saturday'];
var month = '7';
var year = '2012';
realMonth = parseInt(month,10)-1;
var monthObj = {};
for(var i=1;i<30;i++)
{
    var d = new Date(year,realMonth,i);              
    monthObj[i] = weekday[d.getDay()];
}
console.log(monthObj);
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接