Javascript 正在获取当月的当前周

Javascript 正在获取当月的当前周,javascript,php,date,Javascript,Php,Date,我找到了一个和一个php来获取基于全年的当前一周。那很好,但我有点困惑。我想知道是本月的第1、2、3、4周还是全年。我该怎么办 javascript /** * Returns the week number for this date. dowOffset is the day of week the week * "starts" on for your locale - it can be from 0 to 6. If dowOffset is 1 (Monday), * the

我找到了一个和一个php来获取基于全年的当前一周。那很好,但我有点困惑。我想知道是本月的第1、2、3、4周还是全年。我该怎么办

javascript

/**
 * Returns the week number for this date.  dowOffset is the day of week the week
 * "starts" on for your locale - it can be from 0 to 6. If dowOffset is 1 (Monday),
 * the week returned is the ISO 8601 week number.
 * @param int dowOffset
 * @return int
 */
Date.prototype.getWeek = function (dowOffset) {
/*getWeek() was developed by Nick Baicoianu at MeanFreePath: http://www.meanfreepath.com */

    dowOffset = typeof(dowOffset) == 'int' ? dowOffset : 0; //default dowOffset to zero
    var newYear = new Date(this.getFullYear(),0,1);
    var day = newYear.getDay() - dowOffset; //the day of week the year begins on
    day = (day >= 0 ? day : day + 7);
    var daynum = Math.floor((this.getTime() - newYear.getTime() - 
    (this.getTimezoneOffset()-newYear.getTimezoneOffset())*60000)/86400000) + 1;
    var weeknum;
    //if the year starts before the middle of a week
    if(day < 4) {
        weeknum = Math.floor((daynum+day-1)/7) + 1;
        if(weeknum > 52) {
            nYear = new Date(this.getFullYear() + 1,0,1);
            nday = nYear.getDay() - dowOffset;
            nday = nday >= 0 ? nday : nday + 7;
            /*if the next year starts before the middle of
              the week, it is week #1 of that year*/
            weeknum = nday < 4 ? 1 : 53;
        }
    }
    else {
        weeknum = Math.floor((daynum+day-1)/7);
    }
    return weeknum;
};
var d = new Date();
var date = d.getDate();
var day = d.getDay();

var weekOfMonth = Math.ceil((date + 6 - day)/7);

document.getElementById('week').value = weekOfMonth;

对于那些只想知道从1到5的哪一周的人来说,这可以获得当月的当前周

脚本

/**
 * Returns the week number for this date.  dowOffset is the day of week the week
 * "starts" on for your locale - it can be from 0 to 6. If dowOffset is 1 (Monday),
 * the week returned is the ISO 8601 week number.
 * @param int dowOffset
 * @return int
 */
Date.prototype.getWeek = function (dowOffset) {
/*getWeek() was developed by Nick Baicoianu at MeanFreePath: http://www.meanfreepath.com */

    dowOffset = typeof(dowOffset) == 'int' ? dowOffset : 0; //default dowOffset to zero
    var newYear = new Date(this.getFullYear(),0,1);
    var day = newYear.getDay() - dowOffset; //the day of week the year begins on
    day = (day >= 0 ? day : day + 7);
    var daynum = Math.floor((this.getTime() - newYear.getTime() - 
    (this.getTimezoneOffset()-newYear.getTimezoneOffset())*60000)/86400000) + 1;
    var weeknum;
    //if the year starts before the middle of a week
    if(day < 4) {
        weeknum = Math.floor((daynum+day-1)/7) + 1;
        if(weeknum > 52) {
            nYear = new Date(this.getFullYear() + 1,0,1);
            nday = nYear.getDay() - dowOffset;
            nday = nday >= 0 ? nday : nday + 7;
            /*if the next year starts before the middle of
              the week, it is week #1 of that year*/
            weeknum = nday < 4 ? 1 : 53;
        }
    }
    else {
        weeknum = Math.floor((daynum+day-1)/7);
    }
    return weeknum;
};
var d = new Date();
var date = d.getDate();
var day = d.getDay();

var weekOfMonth = Math.ceil((date + 6 - day)/7);

document.getElementById('week').value = weekOfMonth;
标记

<input type='text' id='week' value=''>

ISO月内周数基于周一,因此2017年3月2日星期四是2017年2月4日,2017年3月6日星期一是2017年3月1日

因此,算法是移动到上一个星期一,看看它是一个月的哪个星期一。我本以为这是一个副本,但我找不到,所以这里有一个函数

/*根据每月的第一个星期一获取每月的ISO周
**@param{Date}Date-获取月份中的周的日期
**@returns{Object}month:该周所在的月份
**周:每月一周
*/
函数getISOWeekInMonth(日期){
//复制日期,以免影响原始日期
var d=新日期(+日期);
如果(isNaN(d))返回;
//移到上周一
d、 设置日期(d.getDate()-d.getDay()+1);
//周数为ceil日期/7
返回{month:+d.getMonth()+1,
星期:Math.ceil(d.getDate()/7)};
}
//*
[新日期(2017年2月2日)//2017年3月2日星期四
新日期(2017年2月6日)//2017年3月6日星期一
新日期(2017年4月31日)//2017年5月31日星期三
新日期()]。forEach(//当前日期
功能(日期){
console.log(date.toString()+“\n在一周内”+
getISOWeekInMonth(日期).week+“本月的”+
getISOWeekInMonth(日期)。月份);
}
);

//*/
您试过什么吗?我建议您使用这两个脚本,至少尝试解决您的问题,而不是让别人为您编写代码。@Tony:现在就开始尝试。@Tony:如果您能删除您的否决票,那就太好了。在您编辑您的初始帖子之前,我不能这样做。我建议你做一个简单的编辑或者其他什么?我已经试着取消我的反对票了。“你上一次就这个问题投票是在35分钟前。除非这个问题被编辑,否则你的投票现在被锁定。”如果你有示例代码,比如在你自己问题的答案中,你为什么不把代码放在问题中?这将产生第0-4周。。。也许
date+6-day
可以得到1-5天?但大多数月份都超过28天-因此1-4永远不会准确(这意味着一年中有48周)@JaromandaX是这样的。我将编辑并处理它,使其适合程序。此算法基于从月初开始的第一周,可能是一周中的任何一天。ISO 8601标准使用第一个星期一所在的一周,因此,如果星期一不是一个月的第一个星期,则一周中会有属于上个月最后一周的几天。例如,这个算法说2017-03-02是在3月1日,但ISO说是在2月4日。你能告诉我如何使用简化的更动态的代码版本(没有硬编码日期)吗?我只需要在输入中打印整数,就像在我的代码中一样。我会记下你的答案。感谢you@SebastianFarham-这个函数只有4行代码,我认为这很简单。它使用您希望传递给它的任何日期。如果只需要周数,那么将返回值减少到
Math.ceil(d.getDate()/7)
。我确实尝试过这个。然后我尝试打印一个输入->文档.getElementById('week')。value=d;并且为空。@SebastianFarham返回后添加的代码不会被执行。瞧。@奇怪,我确实尝试了一些类似于你在最近的小提琴中所做的事情,但是嘿,非常感谢Rob。