1. ホーム
  2. javascript

[解決済み] JavaScriptでPHPのように年内の週を取得する

2022-04-21 08:23:34

質問

どうすれば、PHPのように現在の週番号を取得できますか? date('W') ?

であるべきです。 ISO-8601 週番号(月曜日から始まる週)。

解決方法は?

ここで欲しいものを手に入れることができるはずです。 <ストライク http://www.merlyn.demon.co.uk/js-date6.htm#YWD .

同サイトのより良いリンクは <ストライク 週単位での作業 .

編集

以下は、提供されたリンクとDommerが以前に投稿したものを基にしたコードです。で軽くテストしています。 <ストライク http://www.merlyn.demon.co.uk/js-date6.htm#YWD . 保証はいたしませんので、十分にテストしてください。

2017年を編集する

サマータイムが実施されていた期間と、1月1日が金曜日の年の日付に問題がありました。すべてのUTCメソッドを使用することで修正しました。以下は、Moment.jsと同じ結果を返します。

/* 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];
}

var result = getWeekNumber(new Date());
document.write('It\'s currently week ' + result[1] + ' of ' + result[0]);

UTC"日付を作成する際、時間はゼロにされます。

最小化されたプロトタイプ版(週番号を返すのみ)。

Date.prototype.getWeekNumber = function(){
  var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
  var dayNum = d.getUTCDay() || 7;
  d.setUTCDate(d.getUTCDate() + 4 - dayNum);
  var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
  return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
};

document.write('The current ISO week number is ' + new Date().getWeekNumber());

テストセクション

このセクションでは、YYYY-MM-DD 形式で任意の日付を入力し、このコードが Moment.js ISO 週番号と同じ週番号を与えることを確認できます (2000 年から 2050 年までの 50 年間でテスト済み)。

Date.prototype.getWeekNumber = function(){
  var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
  var dayNum = d.getUTCDay() || 7;
  d.setUTCDate(d.getUTCDate() + 4 - dayNum);
  var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
  return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
};

function checkWeek() {
  var s = document.getElementById('dString').value;
  var m = moment(s, 'YYYY-MM-DD');
  document.getElementById('momentWeek').value = m.format('W');
  document.getElementById('answerWeek').value = m.toDate().getWeekNumber();      
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

Enter date  YYYY-MM-DD: <input id="dString" value="2021-02-22">
<button onclick="checkWeek(this)">Check week number</button><br>
Moment: <input id="momentWeek" readonly><br>
Answer: <input id="answerWeek" readonly>