[javascript] PHP와 같이 JavaScript로 연중 주당 받기

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”날짜를 만들 때 시간은 0입니다.

최소화 된 프로토 타입 버전 (주 번호 만 반환) :

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>


답변

momentjs 라이브러리를 사용할 수도 있습니다.

moment().format('W')


답변

위에서 말했지만 클래스는 없습니다.

let now = new Date();
let onejan = new Date(now.getFullYear(), 0, 1);
week = Math.ceil( (((now - onejan) / 86400000) + onejan.getDay() + 1) / 7 );


답변

적절하게 http://javascript.about.com/library/blweekyear.htm

Date.prototype.getWeek = function() {
    var onejan = new Date(this.getFullYear(),0,1);
    var millisecsInDay = 86400000;
    return Math.ceil((((this - onejan) /millisecsInDay) + onejan.getDay()+1)/7);
};


답변

Jacob Wright의 Date.format()라이브러리는 PHP date()함수 스타일로 날짜 형식을 구현 하며 ISO-8601 주 번호를 지원합니다.

new Date().format('W');

일주일 동안 약간 과잉 일 수 있지만 PHP 스타일 형식을 지원하며 많은 작업을 수행하는 경우 매우 편리합니다.


답변

getWeekOfYear: function(date) {
        var target = new Date(date.valueOf()),
            dayNumber = (date.getUTCDay() + 6) % 7,
            firstThursday;

        target.setUTCDate(target.getUTCDate() - dayNumber + 3);
        firstThursday = target.valueOf();
        target.setUTCMonth(0, 1);

        if (target.getUTCDay() !== 4) {
            target.setUTCMonth(0, 1 + ((4 - target.getUTCDay()) + 7) % 7);
        }

        return Math.ceil((firstThursday - target) /  (7 * 24 * 3600 * 1000)) + 1;
    }

다음 코드는 표준 시간대와 무관하며 (UTC 날짜 사용) https://en.wikipedia.org/wiki/ISO_8601 에 따라 작동합니다


답변

Oracle의 사양에 설명 된 Java SE의 SimpleDateFormat 클래스가 유용하다는 것을 알았습니다 :
http://goo.gl/7MbCh5 . 내 경우에는 Google Apps Script에서 다음과 같이 작동했습니다.

function getWeekNumber() {
  var weekNum = parseInt(Utilities.formatDate(new Date(), "GMT", "w"));
  Logger.log(weekNum);
}

예를 들어 스프레드 시트 매크로에서 파일의 실제 시간대를 검색 할 수 있습니다.

function getWeekNumber() {
  var weekNum = parseInt(Utilities.formatDate(new Date(), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "w"));
  Logger.log(weekNum);
}