【问题标题】:Getting current week of current month获取当前月份的当前周
【发布时间】:2017-03-29 23:00:55
【问题描述】:

我找到了一个 javascript 和一个 php script 来获取基于全年的当前周。这很棒,但我有点困惑。我想知道是否是本月的第 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 mydate = new Date(2011,2,3); // month number starts from 0
// or like this
var mydate = new Date('March 3, 2011');
alert(mydate.getWeek());

【问题讨论】:

  • 你有没有尝试过?我建议使用这两个脚本并至少尝试解决您的问题,而不是让别人为您编写代码。
  • @Tony:现在尝试一下。
  • @Tony:如果你能删除你的反对票,那就太好了。
  • 在您编辑您的初始帖子之前,我无法做到。我会建议一个简单的编辑或什么?我已经尝试取消我的反对票。 “您上次对这个问题投票是在 35 分钟前。除非编辑此问题,否则您的投票现在已锁定。”
  • 如果您有示例代码,例如在您对自己问题的回答中,为什么不将代码放在问题中?

标签: javascript php date


【解决方案1】:

对于那些只想知道从 1 到 5 是哪一周的人来说,这适用于获取当月的当前周。

脚本

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=''>

【讨论】:

  • 这将产生第 0 - 4 周...也许date + 6 - day 得到 1 - 5?
  • 但大多数月份有超过 28 天 - 所以 1 - 4 永远不会准确(这意味着一年中有 48 周)
  • @JaromandaX 对。我将对其进行编辑和解决,使其适合程序。
  • 此算法基于从每月第一天开始的第一周,这可能是一周中的任何一天。 ISO 8601 标准使用第一个星期一所在的星期,因此如果星期一不是一个月的第一天,则一周中的某些天属于上个月的最后一周。例如。这个算法说 2017-03-02 是在 3 月的第 1 周,但 ISO 说它是在 2 月的第 4 周。
【解决方案2】:

ISO 月份中的周数基于星期一,因此 2017 年 3 月 2 日星期四是 2017 年 2 月的第 4 周,而 2017 年 3 月 6 日星期一是 3 月的第 1 周。

所以算法是移动到前一个星期一,看看它是一个月中的哪个星期一。我原以为这是重复的,但我找不到,所以这里有一个函数。

/* Get ISO week in month, based on first Monday in month
** @param {Date} date - date to get week in month of
** @returns {Object} month: month that week is in
**                   week: week in month
*/
function getISOWeekInMonth(date) {
  // Copy date so don't affect original
  var d = new Date(+date);
  if (isNaN(d)) return;
  // Move to previous Monday
  d.setDate(d.getDate() - d.getDay() + 1);
  // Week number is ceil date/7
  return {month: +d.getMonth()+1,
          week: Math.ceil(d.getDate()/7)};
}
//*
[new Date(2017,2,2),   // Thu 2 Mar 2017
 new Date(2017,2,6),   // Mon 6 Mar 2017
 new Date(2017,4,31),  // Wed 31 May 2017
 new Date()].forEach(  // Current date
  function(date) {
    console.log(date.toString() + '\nis in week ' +
    getISOWeekInMonth(date).week + ' of month ' +
    getISOWeekInMonth(date).month);
  }
);
//*/

如果你想获得一年中的 ISO 周,那么Get week of year in JavaScript like in PHP 有你的答案。

【讨论】:

  • 你能告诉我如何使用简化的更动态的代码版本(没有硬编码的日期)吗?我只需要像在我的代码中那样在输入中打印整数。我会把你标记为答案。谢谢
  • @SebastianFarham——这个函数只有 4 行代码,我认为这很简单。它使用您希望传递给它的任何日期。如果您只想要周数,则将返回减少到Math.ceil(d.getDate()/7)
  • 我确实试过这个。然后我尝试打印一个输入 -> document.getElementById('week').value = d;和空白。
  • @SebastianFarham——返回后添加的代码没有被执行。见updated fiddle
  • @Strange 我确实尝试了类似于你在最近的小提琴中所做的事情,但是非常感谢 Rob。
【解决方案3】:

您可以使用此代码获取当前星期日期:

let current = new Date(); 
let weekDate = [];

for (let i = 1; i <= 7; i++) {
   // we store inside start 1,2,3,4,5,6,7. here a week start from monday
   let start = current.getDate() - current.getDay() + i;
   // we get complete date in week by new Date(current.setDate(start)).
   //return Mon Mar 14 2022 09:40:42 GMT+0430 (Afghanistan Time)
   //convert to iso date to slice and get only year,month and day like 2022-03-14
   let days = new Date(current.setDate(start)).toISOString().slice(0, 10);
   weekDate.push(days);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多