2

javascript で、特定の年の週数を調べるにはどうすればよいですか? year-dec-31 から週番号を取得すると、週 1 になる可能性があるため失敗します。

この質問は、特定の年の週数を計算して答えますが、JSでこれを計算するきちんとした方法はありますか?

4

3 に答える 3

9

ISO 8601 スタンダードウィークについて

function getISOWeeks(y) {
  var d,
    isLeap;

  d = new Date(y, 0, 1);
  isLeap = new Date(y, 1, 29).getMonth() === 1;

  //check for a Jan 1 that's a Thursday or a leap year that has a 
  //Wednesday jan 1. Otherwise it's 52
  return d.getDay() === 4 || isLeap && d.getDay() === 3 ? 53 : 52
}
console.log(getISOWeeks(2019))
console.log(getISOWeeks(2020))
console.log(getISOWeeks(2021))

以下の2つの投稿からまとめてみました。

Ruby で 1 年の週数を計算する

うるう年を見つけるためのJavaScript

于 2013-08-30T17:17:45.010 に答える
1

これでうまくいくはずです=)

function getWeeks(d) {
 var first = new Date(d.getFullYear(),0,1);
 var dayms = 1000 * 60 * 60 * 24;
 var numday = ((d - first)/dayms)
 var weeks = Math.ceil((numday + first.getDay()+1) / 7) ; 
 return weeks


}

console.log(getWeeks(new Date("31 Dec 2012"))) // 53
  • これにより、最初に、週を取得したい年の最初の1月が取得されます。
  • 次に、指定された日付から最初の1月を減算します(その日からのミリ秒になります)
  • それを86400000で割って、日数を取得します
  • 1月1日からの曜日からの日数を追加します
  • すべてを7で割ります
  • うるう年に関係なく動作するはずです。

Iso 8601の週の番号付けに固執したい場合は、週の最初の年の状態を確認してください

  • その年の最初の木曜日が含まれる週(正式なISO定義)、
  • 1月4日が含まれる週、
  • 初年度の過半数(4日以上)の最初の週、および
  • 12月29日から1月4日までの月曜日から始まる週。

これに少し調整できます

function getIsoWeeks(d) {
 var first = new Date(d.getFullYear(),0,4);
 var dayms = 1000 * 60 * 60 * 24;
 var numday = ((d - first)/dayms)
 var weeks = Math.ceil((numday + first.getDay()+1) / 7) ; 
 return weeks   
}

console.log(getWeeks(new Date("31 Dec 2016"))) // 53
console.log(getIsoWeeks(new Date("31 Dec 2016")) //52

もちろん、コードを短くしてすべて一緒に絞ることもできますが、読みやすくするために、daymsのような使用済み変数を宣言しました

このJSBinの例もご覧ください。

于 2012-12-10T08:53:27.427 に答える
0

ISO-8601 の場合:

アプローチ#1:

function FunctionP(y) {
    return (y + Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400)) % 7;
}

function WeekCount(y) {
    var additionalWeek = (FunctionP(y) == 4 || FunctionP(y-1) == 3) ? 1 : 0;
    return weekCount = 52 + additionalWeek;
}

アプローチ # 2 : https://www.w3resource.com/javascript-exercises/javascript-date-exercise-24.phpからの GetISO8601Week プロトタイプのロジック

function GetMaxWeekCountOfISOYear(yyyy) {
  var dec31YYYY = (new Date(yyyy, 11, 31));
  var dec31Day = dec31YYYY.getDay();

  return dec31Day >= 1 && dec31Day <= 3 ?
    Number(GetSunday(dec31YYYY).GetISO8601Week()) :
    Number(dec31YYYY.GetISO8601Week());
}

Date.prototype.GetISO8601Week = function() {
  var target = new Date(this.valueOf());
  var dayNr = (this.getDay() + 6) % 7;
  target.setDate(target.getDate() - dayNr + 3);
  var firstThursday = target.valueOf();
  target.setMonth(0, 1);
  if (target.getDay() != 4) {
    target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
  }
  return 1 + Math.ceil((firstThursday - target) / 604800000);
};

function GetSunday(requestDate) {
  requestDate = new Date(requestDate.setHours(0, 0, 0, 0));
  var day = requestDate.getDay(),
    diff = requestDate.getDate() - day;
  return new Date(requestDate.setDate(diff));
}
于 2021-06-18T10:51:42.477 に答える