JavaScript-현재 날짜에서 첫 번째 요일 가져 오기


161

주중 첫날을 얻는 가장 빠른 방법이 필요합니다. 예를 들어 오늘은 11 월 11 일과 목요일입니다. 11 월 8 일인 월요일과 월요일 인 이번 주 첫날을 원합니다. MongoDB 맵 기능, 아이디어가 가장 빠른 방법이 필요합니까?


약간의 속도가 중요하다면 내 답변의 성능을 테스트하고 싶을 수도 있습니다. 브라우저에서 내 성능이 약간 향상되었습니다 (CMS를 선호하는 IE 제외). 물론 MongoDB로 테스트해야합니다. 함수가 월요일 인 날짜를 전달하면 수정되지 않은 원래 날짜 만 리턴하므로 훨씬 빠릅니다.
user113716

나는 같은 문제가 있었고 자바 스크립트 날짜 객체에 현재 사용중인 버그가 많기 때문에 datedate.com (여기서는 code.google.com/p/datejs )은 기본 날짜의 미스 동작을 수정하는 라이브러리입니다.
lolol

질문 제목은주의 첫 번째 요일을 요구하지만 질문 설명은 마지막 월요일의 날짜를 요구합니다. 이들은 실제로 두 가지 다른 질문입니다. 둘 다 올바른 방식으로 해결하는 내 대답을 확인하십시오.
Louis Ameline

답변:


322

사용하여 getDayDate 객체 메서드를 요일 (0 = 일요일, 1 = 월요일 등)을 알 수 있습니다.

그런 다음 해당 일 수에 1을 더한 것을 뺄 수 있습니다. 예를 들면 다음과 같습니다.

function getMonday(d) {
  d = new Date(d);
  var day = d.getDay(),
      diff = d.getDate() - day + (day == 0 ? -6:1); // adjust when day is sunday
  return new Date(d.setDate(diff));
}

getMonday(new Date()); // Mon Nov 08 2010

3
이 기능에 버그가 있습니까? - 문제의 날짜가 목요일 인 경우 2, 일 = 4, DIFF = 2 - 4 = -1 + 1, 및하여 setDate의 결과가 (참조 '이전 달의 마지막 날 전날'될 것 ).
Izhaki

2
@Izhaki 무슨 뜻인가요? 5 월 2 일의 경우이 함수는 4 월 29 일을 반환합니다.
meze

14
일요일 diff = d.getDate() - day;
이주의

2
@SMS 코드를 주셔서 감사합니다. 나는 첫 요일의 정확히 0 시간을 얻기 위해 약간 비 틀었습니다. d.setHours(0); d.setMinutes(0); d.setSeconds(0);
Awi

3
그건 그렇고, d.setDate는 변경 가능하고 "d"자체를 변경합니다
Ayyash

53

성능과 어떻게 비교되는지 확실하지 않지만 작동합니다.

var today = new Date();
var day = today.getDay() || 7; // Get current day number, converting Sun. to 7
if( day !== 1 )                // Only manipulate the date if it isn't Mon.
    today.setHours(-24 * (day - 1));   // Set the hours to day number minus 1
                                         //   multiplied by negative 24
alert(today); // will be Monday

또는 기능으로 :

# modifies _date_
function setToMonday( date ) {
    var day = date.getDay() || 7;  
    if( day !== 1 ) 
        date.setHours(-24 * (day - 1)); 
    return date;
}

setToMonday(new Date());

4
이것은 답변이되어야했고, 질문에 대답 한 유일한 답변이었습니다. 다른 사람들은 버그가 있거나 타사 라이브러리를 참조합니다.
OverMars

그것은 나를 위해 작동 멋진! 약간의 조정을함으로써 주어진 날짜로부터 월요일과 금요일을 모두 시원하게합니다!
alexventuraio 2016 년

10
이 함수는 "setToMonday"라고 불리는 것을 제외하고는 전달 된 날짜 객체를 수정합니다. getMonday, 전달 된 날짜를 기준으로 월요일 인 새로운 날짜를 반환합니다. 이 기능. 가장 쉬운 수정은 date = new Date(date);getMonday 함수의 첫 번째 행으로 두는 것입니다.
Shane

대단해. getSunday 메소드가 훨씬 쉽습니다! 무리 감사!
JesusIsMyDriver.dll 1

4
이 답변은 낮 시간 절약으로 하루 종일 24 시간이 아니기 때문에 잘못되었습니다. 날짜의 시간을 예기치 않게 변경하거나 특정 상황에서 잘못된 날을 반환 할 수도 있습니다.
루이 Ameline

13

Date.js를 확인하십시오

Date.today().previous().monday()

1
또는 아마Date.parse('last monday');
Anurag

MongoDB 데이터베이스에 필요합니다. 그래서 date.js를 참조 할 수 없지만 코드 스 니펫에 감사드립니다.
INs

1
아, MongoDB에서 JS를 직접 실행할 수 있다는 것을 알지 못했습니다. 꽤 매끄 럽습니다. 쿼리 데이터를 준비하기 위해 JS를 사용한다고 가정했습니다.
Matt

jQuery와 마찬가지로 하나의 간단한 함수에 액세스하기 위해 전체 라이브러리를 축소하는 데 관심이 없습니다.
머핀 맨

국가가 있기 때문에 좋은 해결책은 아닙니다. 요일은 일요일입니다.
Stefan Brendle

11

CMS의 답변은 정확하지만 월요일은 주중 첫날이라고 가정합니다.
챈들러 즈 볼레의 대답은 정확하지만 날짜 프로토 타입과 함께 바이올린입니다.
시간 / 분 / 초 / 밀리 초로 재생되는 다른 답변이 잘못되었습니다.

아래 함수는 정확하며 날짜를 첫 번째 매개 변수로, 원하는 요일을 두 번째 매개 변수로 사용합니다 (일요일은 0, 월요일은 1 등). 참고 :시, 분 및 초는 0으로 설정되어 하루가 시작됩니다.

function firstDayOfWeek(dateObject, firstDayOfWeekIndex) {

    const dayOfWeek = dateObject.getDay(),
        firstDayOfWeek = new Date(dateObject),
        diff = dayOfWeek >= firstDayOfWeekIndex ?
            dayOfWeek - firstDayOfWeekIndex :
            6 - dayOfWeek

    firstDayOfWeek.setDate(dateObject.getDate() - diff)
    firstDayOfWeek.setHours(0,0,0,0)

    return firstDayOfWeek
}

// August 18th was a Saturday
let lastMonday = firstDayOfWeek(new Date('August 18, 2018 03:24:00'), 1)

// outputs something like "Mon Aug 13 2018 00:00:00 GMT+0200"
// (may vary according to your time zone)
document.write(lastMonday)


8
var dt = new Date(); // current date of week
var currentWeekDay = dt.getDay();
var lessDays = currentWeekDay == 0 ? 6 : currentWeekDay - 1;
var wkStart = new Date(new Date(dt).setDate(dt.getDate() - lessDays));
var wkEnd = new Date(new Date(wkStart).setDate(wkStart.getDate() + 6));

이것은 잘 작동합니다.


4

나는 이것을 사용하고있다

function get_next_week_start() {
   var now = new Date();
   var next_week_start = new Date(now.getFullYear(), now.getMonth(), now.getDate()+(8 - now.getDay()));
   return next_week_start;
}

3

이 함수는 현재 밀리 초 시간을 사용하여 현재 주를 빼고 현재 날짜가 월요일 (일요일부터 자바 스크립트 수) 인 경우 1 주를 더 뺍니다.

function getMonday(fromDate) {
    // length of one day i milliseconds
  var dayLength = 24 * 60 * 60 * 1000;

  // Get the current date (without time)
    var currentDate = new Date(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate());

  // Get the current date's millisecond for this week
  var currentWeekDayMillisecond = ((currentDate.getDay()) * dayLength);

  // subtract the current date with the current date's millisecond for this week
  var monday = new Date(currentDate.getTime() - currentWeekDayMillisecond + dayLength);

  if (monday > currentDate) {
    // It is sunday, so we need to go back further
    monday = new Date(monday.getTime() - (dayLength * 7));
  }

  return monday;
}

일주일이 한 달에서 다른 달 (그리고 몇 년)에 걸쳐있을 때 테스트했으며 제대로 작동하는 것 같습니다.


3

안녕하세요,

간단한 확장 방법을 선호합니다.

Date.prototype.startOfWeek = function (pStartOfWeek) {
    var mDifference = this.getDay() - pStartOfWeek;

    if (mDifference < 0) {
        mDifference += 7;
    }

    return new Date(this.addDays(mDifference * -1));
}

이것이 실제로 사용하는 다른 확장 방법을 사용한다는 것을 알 수 있습니다.

Date.prototype.addDays = function (pDays) {
    var mDate = new Date(this.valueOf());
    mDate.setDate(mDate.getDate() + pDays);
    return mDate;
};

이제 주가 일요일에 시작되면 pStartOfWeek 매개 변수에 "0"을 전달하십시오.

var mThisSunday = new Date().startOfWeek(0);

마찬가지로 주가 월요일에 시작되면 pStartOfWeek 매개 변수에 "1"을 전달하십시오.

var mThisMonday = new Date().startOfWeek(1);

문안 인사,


2

주의 첫날

오늘부터 요일의 날짜를 얻으려면 다음과 같이 사용할 수 있습니다.

function getUpcomingSunday() {
  const date = new Date();
  const today = date.getDate();
  const dayOfTheWeek = date.getDay();
  const newDate = date.setDate(today - dayOfTheWeek + 7);
  return new Date(newDate);
}

console.log(getUpcomingSunday());

또는 오늘부터 마지막 ​​요일을 얻으려면 :

function getLastSunday() {
  const date = new Date();
  const today = date.getDate();
  const dayOfTheWeek = date.getDay();
  const newDate = date.setDate(today - (dayOfTheWeek || 7));
  return new Date(newDate);
}

console.log(getLastSunday());

* 시간대에 따라 주 시작은 일요일에 시작할 필요가 없습니다. 금요일, 토요일, 월요일 또는 컴퓨터가 설정된 다른 요일에 시작할 수 있습니다. 이러한 방법이이를 설명합니다.

* toISOString다음과 같은 방법 으로 형식을 지정할 수도 있습니다 .getLastSunday().toISOString()


1

setDate ()에는 위의 주석에 언급 된 월 경계에 문제가 있습니다. 확실한 해결 방법은 Date 객체에서 (놀랍게도 반 직관적 인) 메서드 대신 에포크 타임 스탬프를 사용하여 날짜 차이를 찾는 것입니다. 즉

function getPreviousMonday(fromDate) {
    var dayMillisecs = 24 * 60 * 60 * 1000;

    // Get Date object truncated to date.
    var d = new Date(new Date(fromDate || Date()).toISOString().slice(0, 10));

    // If today is Sunday (day 0) subtract an extra 7 days.
    var dayDiff = d.getDay() === 0 ? 7 : 0;

    // Get date diff in millisecs to avoid setDate() bugs with month boundaries.
    var mondayMillisecs = d.getTime() - (d.getDay() + dayDiff) * dayMillisecs;

    // Return date as YYYY-MM-DD string.
    return new Date(mondayMillisecs).toISOString().slice(0, 10);
}

1

내 해결책은 다음과 같습니다.

function getWeekDates(){
    var day_milliseconds = 24*60*60*1000;
    var dates = [];
    var current_date = new Date();
    var monday = new Date(current_date.getTime()-(current_date.getDay()-1)*day_milliseconds);
    var sunday = new Date(monday.getTime()+6*day_milliseconds);
    dates.push(monday);
    for(var i = 1; i < 6; i++){
        dates.push(new Date(monday.getTime()+i*day_milliseconds));
    }
    dates.push(sunday);
    return dates;
}

이제 반환 된 배열 인덱스로 날짜를 선택할 수 있습니다.


0

Date함수 없이 수학적으로 만 계산하는 예입니다 .

const date = new Date();
const ts = +date;

const mondayTS = ts - ts % (60 * 60 * 24 * (7-4) * 1000);

const monday = new Date(mondayTS);
console.log(monday.toISOString(), 'Day:', monday.getDay());

const formatTS = v => new Date(v).toISOString();
const adjust = (v, d = 1) => v - v % (d * 1000);

const d = new Date('2020-04-22T21:48:17.468Z');
const ts = +d; // 1587592097468

const test = v => console.log(formatTS(adjust(ts, v)));

test();                     // 2020-04-22T21:48:17.000Z
test(60);                   // 2020-04-22T21:48:00.000Z
test(60 * 60);              // 2020-04-22T21:00:00.000Z
test(60 * 60 * 24);         // 2020-04-22T00:00:00.000Z
test(60 * 60 * 24 * (7-4)); // 2020-04-20T00:00:00.000Z, monday

// So, what does `(7-4)` mean?
// 7 - days number in the week
// 4 - shifting for the weekday number of the first second of the 1970 year, the first time stamp second.
//     new Date(0)          ---> 1970-01-01T00:00:00.000Z
//     new Date(0).getDay() ---> 4


0

이것의보다 일반화 된 버전 .. 이것은 당신이 지정한 요일에 따라 현재 주중의 어느 날이든 줄 것입니다.

//returns the relative day in the week 0 = Sunday, 1 = Monday ... 6 = Saturday
function getRelativeDayInWeek(d,dy) {
  d = new Date(d);
  var day = d.getDay(),
      diff = d.getDate() - day + (day == 0 ? -6:dy); // adjust when day is sunday
  return new Date(d.setDate(diff));
}

var monday = getRelativeDayInWeek(new Date(),1);
var friday = getRelativeDayInWeek(new Date(),5);

console.log(monday);
console.log(friday);


-1

체크 아웃 : moment.js

예:

moment().day(-7); // last Sunday (0 - 7)
moment().day(7); // next Sunday (0 + 7)
moment().day(10); // next Wednesday (3 + 7)
moment().day(24); // 3 Wednesdays from now (3 + 7 + 7 + 7)

보너스 : node.js 와도 작동


18
그러나 OP의 질문에 대한 답변은 아닙니다. 그는 날짜가 08/07/14 (d / m / y)입니다. 그는 될 순간에 자신의 질문에 대한 답변 (내 로케일이 방금 지난 월요일 또는 어제 것)이 일주일의 첫날을하고 싶어moment().startOf('week')
제론 Pelgrims

moment().startOf("week")로케일 설정에 따라 이전 일요일 날짜 가 표시 될 수 있습니다. 이 경우 moment().startOf('isoWeek')대신 사용하십시오 : runkit.com/embed/wdpi4bjwh6rt
Harm te Molder

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.