web-dev-qa-db-ja.com

Javascriptで月に週を取得

Javascriptで、1か月の週数を取得するにはどうすればよいですか?このためのコードはどこにも見つからないようです。

特定の月に必要な行数を知るには、これが必要です。

具体的には、週に1日以上ある週数(日曜日から土曜日までの週と定義)をお願いします。

したがって、このような場合は、5週間あることを知りたいと思います。

S  M  T  W  R  F  S

         1  2  3  4

5  6  7  8  9  10 11

12 13 14 15 16 17 18

19 20 21 22 23 24 25

26 27 28 29 30 31 

すべての助けをありがとう。

16
Stephen Watkins

週は日曜日に始まります

これは、2月が日曜日に始まらない場合でも機能するはずです。

function weekCount(year, month_number) {

    // month_number is in the range 1..12

    var firstOfMonth = new Date(year, month_number-1, 1);
    var lastOfMonth = new Date(year, month_number, 0);

    var used = firstOfMonth.getDay() + lastOfMonth.getDate();

    return Math.ceil( used / 7);
}

週は月曜日に始まります

function weekCount(year, month_number) {

    // month_number is in the range 1..12

    var firstOfMonth = new Date(year, month_number-1, 1);
    var lastOfMonth = new Date(year, month_number, 0);

    var used = firstOfMonth.getDay() + 6 + lastOfMonth.getDate();

    return Math.ceil( used / 7);
}

週は別の日から始まります

function weekCount(year, month_number, startDayOfWeek) {
  // month_number is in the range 1..12

  // Get the first day of week week day (0: Sunday, 1: Monday, ...)
  var firstDayOfWeek = startDayOfWeek || 0;

  var firstOfMonth = new Date(year, month_number-1, 1);
  var lastOfMonth = new Date(year, month_number, 0);
  var numberOfDaysInMonth = lastOfMonth.getDate();
  var firstWeekDay = (firstOfMonth.getDay() - firstDayOfWeek + 7) % 7;

  var used = firstWeekDay + numberOfDaysInMonth;

  return Math.ceil( used / 7);
}
29
Ed Poor

あなたはそれを計算する必要があります。

あなたは次のようなことをすることができます

var firstDay = new Date(2010, 0, 1).getDay(); // get the weekday january starts on
var numWeeks = 5 + (firstDay >= 5 ? 1 : 0); // if the months starts on friday, then it will end on sunday

今、私たちはそれを一般化する必要があります。

var dayThreshold = [ 5, 1, 5, 6, 5, 6, 5, 5, 6, 5, 6, 5 ];
function GetNumWeeks(month, year)
{
    var firstDay = new Date(year, month, 1).getDay();
    var baseWeeks = (month == 1 ? 4 : 5); // only February can fit in 4 weeks
    // TODO: account for leap years
    return baseWeeks + (firstDay >= dayThreshold[month] ? 1 : 0); // add an extra week if the month starts beyond the threshold day.
}

注:呼び出すときは、JavaScriptで月のインデックスがゼロになることに注意してください(つまり、1月== 0)。

4
Joel

最も理解しやすい方法は

<div id="demo"></div>

<script type="text/javascript">

 function numberOfDays(year, month)
 {
   var d = new Date(year, month, 0);
   return d.getDate();
 }


 function getMonthWeeks(year, month_number)
 {
   var $num_of_days       = numberOfDays(year, month_number)
    ,  $num_of_weeks      = 0
    ,  $start_day_of_week = 0; 

   for(i=1; i<=$num_of_days; i++)
   {
      var $day_of_week = new Date(year, month_number, i).getDay();
      if($day_of_week==$start_day_of_week)
      {
        $num_of_weeks++;
      }   
   }

    return $num_of_weeks;
 }

   var d = new Date()
      , m = d.getMonth()
      , y = d.getFullYear();

   document.getElementById('demo').innerHTML = getMonthWeeks(y, m);
</script>
3
Joseph Soares
function weeksinMonth(m, y){
 y= y || new Date().getFullYear();
 var d= new Date(y, m, 0);
 return Math.floor((d.getDate()- 1)/7)+ 1;     
}
alert(weeksinMonth(3))

//このメソッドの月の範囲は1(1月)-12(12月)です

3
kennebec

これは非常に単純な2行のコードです。そして私は100%テストしました。

Date.prototype.getWeekOfMonth = function () {
    var firstDay = new Date(this.setDate(1)).getDay();
    var totalDays = new Date(this.getFullYear(), this.getMonth() + 1, 0).getDate();
    return Math.ceil((firstDay + totalDays) / 7);
}

使い方

var totalWeeks = new Date().getWeekOfMonth();
console.log('Total Weeks in the Month are : + totalWeeks ); 
2
imdadhusen

モーメントjsを使用

function getWeeksInMonth(year, month){

        var monthStart     = moment().year(year).month(month).date(1);
        var monthEnd       = moment().year(year).month(month).endOf('month');
        var numDaysInMonth = moment().year(year).month(month).endOf('month').date();

        //calculate weeks in given month
        var weeks      = Math.ceil((numDaysInMonth + monthStart.day()) / 7);
        var weekRange  = [];
        var weekStart = moment().year(year).month(month).date(1);
        var i=0;

        while(i<weeks){
            var weekEnd   = moment(weekStart);


            if(weekEnd.endOf('week').date() <= numDaysInMonth && weekEnd.month() == month) {
                weekEnd = weekEnd.endOf('week').format('LL');
            }else{
                weekEnd = moment(monthEnd);
                weekEnd = weekEnd.format('LL')
            }

            weekRange.Push({
                'weekStart': weekStart.format('LL'),
                'weekEnd': weekEnd
            });


            weekStart = weekStart.weekday(7);
            i++;
        }

        return weekRange;
    } console.log(getWeeksInMonth(2016, 7))
2
siva

一貫したゼロベースの月インデックスを使用するES6バリアント。 2015年から2025年までの数年間テスト済み。

/**
 * Returns number of weeks
 *
 * @param {Number} year - full year (2018)
 * @param {Number} month - zero-based month index (0-11)
 * @param {Boolean} fromMonday - false if weeks start from Sunday, true - from Monday.
 * @returns {number}
 */
const weeksInMonth = (year, month, fromMonday = false) => {
    const first = new Date(year, month, 1);
    const last  = new Date(year, month + 1, 0);
    let dayOfWeek = first.getDay();
    if (fromMonday && dayOfWeek === 0) dayOfWeek = 7;
    let days = dayOfWeek + last.getDate();
    if (fromMonday) days -= 1;
    return Math.ceil(days / 7);
}
2
Webars

my time.jsライブラリ を使用できます。これがweeksInMonth関数です:

// http://github.com/augustl/time.js/blob/623e44e7a64fdaa3c908debdefaac1618a1ccde4/time.js#L67

weeksInMonth: function(){
  var millisecondsInThisMonth = this.clone().endOfMonth().Epoch() - this.clone().firstDayInCalendarMonth().Epoch();
  return Math.ceil(millisecondsInThisMonth / MILLISECONDS_IN_WEEK);
},

機能の要点はendOfMonthとfirstDayInCalendarMonthにあるため、少しわかりにくいかもしれませんが、少なくともそれがどのように機能するかについてはある程度理解できるはずです。

1
August Lilleaas

これは私のために働きます、

function(d){
    var firstDay = new Date(this.getFullYear(), this.getMonth(), 1).getDay();
    return Math.ceil((d.getDate() + (firstDay - 1))/7);
}

「d」は日付である必要があります。

0
BhargavG

Ed Poorのソリューションのおかげで、これはDateプロトタイプと同じです。

Date.prototype.countWeeksOfMonth = function() {
  var year         = this.getFullYear();
  var month_number = this.getMonth();
  var firstOfMonth = new Date(year, month_number-1, 1);
  var lastOfMonth  = new Date(year, month_number, 0);
  var used         = firstOfMonth.getDay() + lastOfMonth.getDate();
  return Math.ceil( used / 7);
}

だからあなたはそれを次のように使うことができます

var weeksInCurrentMonth = new Date().countWeeksOfMonth();
var weeksInDecember2012 = new Date(2012,12,1).countWeeksOfMonth(); // 6
0
con

私はこれが遅れていることを知っています、私は特定の月が当たる週数を取得しようとするコードのコードを見ました、しかし多くは本当に正確ではありませんでした、しかしほとんどは本当に有益で再利用可能でした、私は専門のプログラマーではありませんが私は本当に考えることができ、何人かの人々によるいくつかのコードのおかげで私は結論に達することができました。

function convertDate(date) {//i lost the guy who owns this code lol
var yyyy = date.getFullYear().toString();
var mm = (date.getMonth()+1).toString();
var dd  = date.getDate().toString();

var mmChars = mm.split('');
var ddChars = dd.split('');

return yyyy + '-' + (mmChars[1]?mm:"0"+mmChars[0]) + '-' + (ddChars[1]?dd:"0"+ddChars[0]);
}

//this line of code from https://stackoverflow.com/a/4028614/2540911
var days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];

var myDate = new Date('2019-03-2');  
//var myDate = new Date(); //or todays date

var c = convertDate(myDate).split("-"); 
let yr = c[0], mth = c[1], dy = c[2];

weekCount(yr, mth, dy)

//Ahh yes, this line of code is from Natim Up there, incredible work, https://stackoverflow.com/a/2485172/2540911
function weekCount(year, month_number, startDayOfWeek) {
// month_number is in the range 1..12
  console.log(weekNumber);

// Get the first day of week week day (0: Sunday, 1: Monday, ...)
var firstDayOfWeek = startDayOfWeek || 0;

var firstOfMonth = new Date(year, month_number-1, 1);
var lastOfMonth = new Date(year, month_number, 0);
var numberOfDaysInMonth = lastOfMonth.getDate();
var first = firstOfMonth.getDate();

//initialize first week
let weekNumber = 1;
while(first-1 < numberOfDaysInMonth){    
// add a day
firstOfMonth = firstOfMonth.setDate(firstOfMonth.getDate() + 1);//this line of code from https://stackoverflow.com/a/9989458/2540911
if(days[firstOfMonth.getDay()] === "Sunday"){//get new week every new sunday according the local date format
  //get newWeek
  weekNumber++;          
}

  if(weekNumber === 3 && days[firstOfMonth.getDay()] === "Friday")
    alert(firstOfMonth);

  first++
 }
}

新しい月の第3金曜日ごとに教会のスケジュールまたはイベントスケジューラを生成するためにこのコードが必要だったので、これを自分に合わせて変更したり、「金曜日ではなく特定の日付を選択して月の週とVoilaを指定したりできます」 !! どうぞ

0
    function weekCount(year, month_number, day_start) {

        // month_number is in the range 1..12
        // day_start is in the range 0..6 (where Sun=0, Mon=1, ... Sat=6)

        var firstOfMonth = new Date(year, month_number-1, 1);
        var lastOfMonth = new Date(year, month_number, 0);

        var dayOffset = (firstOfMonth.getDay() - day_start + 7) % 7;
        var used = dayOffset + lastOfMonth.getDate();

        return Math.ceil( used / 7);
    }
0
Ed Poor

このコードは、特定の月の正確な週数を示します。

Date.prototype.getMonthWeek = function(monthAdjustement)
{       
    var firstDay = new Date(this.getFullYear(), this.getMonth(), 1).getDay();
    var returnMessage = (Math.ceil(this.getDate()/7) + Math.floor(((7-firstDay)/7)));
    return returnMessage;
}

monthAdjustement変数は、現在の月を加算または減算します

JSのカレンダープロジェクトとObjective-Cの同等のプロジェクトで使用していますが、うまく機能します

0
function getWeeksInMonth(month_number, year) {
  console.log("year - "+year+" month - "+month_number+1);

  var day = 0;
  var firstOfMonth = new Date(year, month_number, 1);
  var lastOfMonth = new Date(year, parseInt(month_number)+1, 0);

  if (firstOfMonth.getDay() == 0) {
    day = 2;
    firstOfMonth = firstOfMonth.setDate(day);
    firstOfMonth = new Date(firstOfMonth);
  } else if (firstOfMonth.getDay() != 1) {
    day = 9-(firstOfMonth.getDay());
    firstOfMonth = firstOfMonth.setDate(day);
    firstOfMonth = new Date(firstOfMonth);
  }

  var days = (lastOfMonth.getDate() - firstOfMonth.getDate())+1
  return Math.ceil( days / 7);              
}

それは私のために働いた。してみてください

皆さんありがとう

0
Vinay

ここでの解決策はどれも私にとって実際にはうまくいきませんでした。これが私のひびです。

// Example
// weeksOfMonth(2019, 9) // October
// Result: 5
weeksOfMonth (year, monthIndex) {
  const d = new Date(year, monthIndex+ 1, 0)
  const adjustedDate = d.getDate() + d.getDay()
  return Math.ceil(adjustedDate / 7)
}
0
Phreak Nation