Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript获取当前周,而不使用其他库?[因此示例被破坏]_Javascript_Date - Fatal编程技术网

使用JavaScript获取当前周,而不使用其他库?[因此示例被破坏]

使用JavaScript获取当前周,而不使用其他库?[因此示例被破坏],javascript,date,Javascript,Date,我构建了一个日历控件,并添加了周数作为最后一次触摸,但在SO上和SO之外找到的每个脚本示例都遇到了问题(其中大部分都是从另一个脚本中复制的) 问题在于,当日期落在部分月份时,周计算似乎会出错,要么在新月份的同一周继续计算,要么认为上个月的最后一个整周与下个月的第一个整周相同 以下是其中一个库的视觉演示(它们都有其不准确之处,因为它们通常根据固定的数字计算周数,并从中构建): 您可以查看,因为项目相当复杂,我在一开始就使用了Date.prototype.getWeek函数来更轻松地使用它。您可以

我构建了一个日历控件,并添加了周数作为最后一次触摸,但在SO上和SO之外找到的每个脚本示例都遇到了问题(其中大部分都是从另一个脚本中复制的)

问题在于,当日期落在部分月份时,周计算似乎会出错,要么在新月份的同一周继续计算,要么认为上个月的最后一个整周与下个月的第一个整周相同

以下是其中一个库的视觉演示(它们都有其不准确之处,因为它们通常根据固定的数字计算周数,并从中构建):

您可以查看,因为项目相当复杂,我在一开始就使用了
Date.prototype.getWeek
函数来更轻松地使用它。您可以随意交换这里找到的示例中的任何代码,因为它们最终都会在几个月内失去活力

使用的一些计算:

当运行“像PHP一样使用JavaScript获取一年中的一周”中的最新示例(2017年)时,现在返回的一周是42周。当你看我的日历时,现在10月的一周显示为42,根据这里的说法是正确的

举个例子,有整整一周的时间共享同一周数,所以我不知道
42
怎么可能准确

Date.prototype.getWeek = function (dowOffset) {
/*getWeek() was developed by Nick Baicoianu at MeanFreePath: http://www.epoch-calendar.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;
};

算法是使用下一个星期六的周数。因此,在下一个星期六,然后在1月1日使用它的年份。如果不是星期天,则转到上一个星期天。然后得到从那里开始的周数。听起来可能有点复杂,但这只是几行代码。以下大部分内容都是游戏的助手

希望注释足够多,getWeekNumber返回一个数组
[year,weekNumber]
。根据Mac OS X日历进行测试,该日历似乎使用相同的周编号。请彻底测试,尤其是夏令时转换前后

/*根据以下内容获取年份中的周数:
*-本周从周日开始
*-周数和年数为下周六的周数和年数,
*如果是星期六,则为当前日期
*2011年第一周于2010年12月26日星期日开始
*2017年第一周于2017年1月1日星期日开始
*
*计算使用UTC以避免日光节约问题。
*
*@param{Date}Date-获取周数的日期
*@返回{number[]}年和周数
*/
函数getWeekNumber(日期){
//将日期复制为UTC以避免DST
var d=新日期(Date.UTC(Date.getFullYear(),Date.getMonth(),Date.getDate());
//转移到下一个星期六,以获得一年
d、 setUTCDate(d.getUTCDate()+6-d.getUTCDay());
//得到一年的第一天
var yearStart=新日期(Date.UTC(d.getUTCFullYear(),0,1));
yearStart.setUTCDate(yearStart.getUTCDate()-yearStart.getUTCDay());
//获取yearStart和d之间的差异(以毫秒为单位)
//减至整周
return[d.getUTCFullYear(),(Math.ceil((d-yearStart)/6.048e8));
}
//帮助设置日期格式
函数fDate(d){
var opts={工作日:'short',月:'short',日:'numeric',年:'numeric'};
返回d.toLocaleString(未定义,选项);
}
//将yyyy-mm-dd解析为本地
函数更新日期{
变量b=(s+“”).split(/\D/);
var d=新日期(b[0],b[1]-1,b[2]);
返回d.getMonth()==b[1]-1?d:新日期(NaN);
}
//手柄按钮点击
函数doButtonClick(){
var d=pDate(document.getElementById('inp0').value);
var span=document.getElementById('weekNumber');
if(isNaN(d)){
span.textContent='无效日期';
}否则{
设[y,w]=getWeekNumber(d);
span.textContent=`${fDate(d)}在${y}的${w}周内;
}
}
日期:
获取周数

嗯,我认为你遇到的问题是星期天开始。如果周数计算取决于周一是一周的开始,那么2018年6月的最后一周直到2018年7月1日才结束,所以它仍然是同一周。此外,我不确定最后一个场景中的问题应该是什么-当然,如果2018年7月的最后一周完成一半,下半周在2018年8月,那么周数仍然是相同的。当一周开始时是特定于区域设置的。在美国,一周从周日开始。在欧洲大部分地区,每周从周一开始。不同的地区对一年中的最初一周使用不同的规则(是否计算?)。如果你认为这些解决方案是错误的,你可能只是假设了一个不同的起点,但你也说过你从上一个链接的解决方案中得到了42个,你的日历和一些网站也同意现在是第42周,所以…?好吧,我已经发布了完整的日历,并对所有奇怪之处进行了说明。54周??哪一年有54周??如果连续一个月倒退一周(例如,上个月上周是41,下个月第一周是40)。。。。这里发生的不仅仅是区域设置开始工作日。如果您不想要ISO周数,请不要使用返回ISO周数的代码。你的周编号算法是什么?你需要说明什么是一年中的第一周,什么是一周中的第一天,这一切都从那里开始。例如,一年中的第一周是以第一个星期日为基础的吗?还是一年中超过4天的第一周?或者…?谢谢你。我测试了其中一个异常(2018-07-01和2018-06-24),它们分别显示了正确的27周和26周。你从哪里得到了最后一个除数的
6.048e8
/* For a given date, get the ISO week number
 *
 * Based on information at:
 *
 *    http://www.merlyn.demon.co.uk/weekcalc.htm#WNR
 *
 * Algorithm is to find nearest thursday, it's year
 * is the year of the week number. Then get weeks
 * between that date and the first day of that year.
 *
 * Note that dates in one year can be weeks of previous
 * or next year, overlap is up to 3 days.
 *
 * e.g. 2014/12/29 is Monday in week  1 of 2015
 *      2012/1/1   is Sunday in week 52 of 2011
 */
function getWeekNumber(d) {
    // Copy date so don't modify original
    d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
    // Set to nearest Thursday: current date + 4 - current day number
    // Make Sunday's day number 7
    d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7));
    // Get first day of year
    var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
    // Calculate full weeks to nearest Thursday
    var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7);
    // Return array of year and week number
    return [d.getUTCFullYear(), weekNo];
}