Як отримати перший та останній день тижня в JavaScript


94

У мене є today = new Date();об’єкт. Мені потрібно отримати перший і останній день поточного тижня. Мені потрібні обидва варіанти для неділі та понеділка як день початку та кінця тижня. Я зараз трохи плутаю код. Чи можете ви допомогти мені?

Відповіді:


189
var curr = new Date; // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6

var firstday = new Date(curr.setDate(first)).toUTCString();
var lastday = new Date(curr.setDate(last)).toUTCString();

firstday
"Sun, 06 Mar 2011 12:25:40 GMT"
lastday
"Sat, 12 Mar 2011 12:25:40 GMT"

Це працює для першого дня = неділі цього тижня та останнього дня = суботи цього тижня. Подовження терміну дії з понеділка на неділю тривіальне.

Робота з першими та останніми днями в різні місяці залишається вправою для користувача


дякую, як я можу це зробити, але коли перший день - понеділок?
JuanPablo

4
var first = curr.getDate() - curr.getDay() +1;
JuanPablo

40
Щоб це працювало, коли у вас різні місяці -var lastday = new Date(curr.setDate(first.getDate()+6)).toUTCString();
Річард Н

2
Подібний код до відповіді @Rayons, але це буде працювати навіть протягом інших місяців та років, також var curr = new Date('2014-10-01T00:00:00'); // get current date var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week var last = first + 6; // last day is the first day + 6 firstday = new Date(curr.setDate(first)).toUTCString(); lastday = new Date(curr.setDate(curr.getDate()+6)).toUTCString(); я тільки що виправив код @ RichardN, який має невелику помилку
Azeez,

60
"як вправа для користувача" ... справді?
adius

62

Будьте обережні з прийнятою відповіддю, вона не встановлює час 00:00:00 та 23:59:59, тому у вас можуть виникнути проблеми.

Я рекомендую використовувати Moment.js для роботи з датами. Для Вашого випадку:

var startOfWeek = moment().startOf('week').toDate();
var endOfWeek   = moment().endOf('week').toDate();

Це лише невеликий випадок використання, дуже просто робити багато складних операцій.

Дізнатися більше можна тут: http://momentjs.com/


19
Якщо ви використовуєте момент, використовуйте "isoweek" замість "week", інакше він почне тиждень з неділі, а закінчить var startOfWeek = moment().startOf('isoweek').toDate(); var endOfWeek = moment().endOf('isoweek').toDate();
суботою,

Дякую, ви, хлопці, врятували мій час :-)
Сайед Етсхам Аббас

1
Для обліку часу без використання moment.js використовуйте Date.setHours: curr.setHours (0,0,0,0); lastday.setHours (23,59,59,59);
матадур

має бути "isoWeek", а не "isoweek"
Mayur Saner

Love moment js, одна з найкращих бібліотек дати / часу!
Віппі

50

Ви також можете використовувати такі рядки коду, щоб отримати першу та останню дату тижня:

var curr = new Date;
var firstday = new Date(curr.setDate(curr.getDate() - curr.getDay()));
var lastday = new Date(curr.setDate(curr.getDate() - curr.getDay()+6));

Сподіваюся, це буде корисним ..


2
Так, але @totymedii, відповідь Рейноса неправильна на 1 березня 2019 року, я маю доказ цього, firstday :: Sun, 24 Feb 2019 08:33:48 GMT останній день :: Sat, 02 Feb 2019 08:33:48 GMT
Діпак Патель

14

Ось швидкий спосіб отримати перший і останній день на будь-який день початку. знаючи, що:

1 день = 86 400 000 мілісекунд.

Значення дат JS вказані в мілісекундах

Рецепт: визначте, скільки днів потрібно видалити, щоб отримати день початку вашого тижня (помножте на мілісекунди на 1 день). Після цього залишається лише додати 6 днів, щоб отримати кінцевий день.

var startDay = 1; //0=sunday, 1=monday etc.
var d = now.getDay(); //get the current day
var weekStart = new Date(now.valueOf() - (d<=0 ? 7-startDay:d-startDay)*86400000); //rewind to start day
var weekEnd = new Date(weekStart.valueOf() + 6*86400000); //add 6 days to get last day

3
Це не працює, оскільки дні не завжди довгі 86 400 000 мілісекунд завдяки переходу на літній час ...
ValarDohaeris

9

Відмінна (і незмінна) бібліотека date-fns вирішує це найбільш стисло:

const start = startOfWeek(date);
const end = endOfWeek(date);

Типовим початковим днем ​​тижня є неділя (0), але його можна змінити на понеділок (1) так:

const start = startOfWeek(date, {weekStartsOn: 1});
const end = endOfWeek(date, {weekStartsOn: 1});

1
плюс 1 за використання дат-фн, а не моменту
CENT1PEDE

@RobG Будь-який метод, який ви використовуєте, матиме перший день тижня за замовчуванням.
Freewalker

4

Ви могли б зробити щось подібне

var today = new Date();
var startDay = 0; 
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (7 - today.getDay() - startDay) % 7);

Де startDayчисло від 0 до 6, де 0 означає неділю (тобто 1 = понеділок, 2 = вівторок тощо).


3

SetDateбуде встановлювати день місяця. Використання setDateпід час початку та кінця місяця призведе до неправильного тижня

var curr = new Date("08-Jul-2014"); // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6
var firstday = new Date(curr.setDate(first)); // 06-Jul-2014
var lastday = new Date(curr.setDate(last)); //12-Jul-2014

Якщо для параметра "Дата" встановлено 01 липня 2014 р., Він відображатиметься як 29 червня 2014 р., А останній день - як 05 червня 2014 р. Замість 05 липня 2014 р.

Тож подолайте цю проблему, якою я користувався

var curr = new Date();
day = curr.getDay();
firstday = new Date(curr.getTime() - 60*60*24* day*1000); //will return firstday (ie sunday) of the week
lastday = new Date(curr.getTime() + 60 * 60 *24 * 6 * 1000); //adding (60*60*6*24*1000) means adding six days to the firstday which results in lastday (saturday) of the week

" Використання setDate під час початку та кінця місяця призведе до неправильного тижня ", якщо воно не використовується правильно.
РобГ

3

Це працює протягом року та місяця.

Date.prototype.GetFirstDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay())));
}

Date.prototype.GetLastDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay() +6)));
}

var today = new Date();

alert(today.GetFirstDayOfWeek());

alert(today.GetLastDayOfWeek());

Тепер це здається зайвим. smh
Chris Lang

А тижні починаються з понеділка?
РобГ

@RobG Будь ласка, зверніться до цього
SHIVA

2

Я рекомендую використовувати Moment.js для таких випадків. У мене були сценарії, коли мені потрібно було перевірити поточний час дати, цього тижня, цього місяця та часу дати цього кварталу. Вища відповідь допомогла мені, тому я подумав поділитися й іншими функціями.

Просто отримати поточний час в конкретному форматі

        case 'Today':
        moment().format("DD/MM/YYYY h:mm A");

        case 'This Week':
          moment().endOf('isoweek').format("DD/MM/YYYY h:mm A");

Тиждень починається з неділі і закінчується в суботу, якщо ми просто використовуємо 'тиждень' як параметр для функції endOf, але щоб отримати неділю як кінець тижня, нам потрібно використовувати 'isoweek'.

        case 'This Month':
          moment().endOf('month').format("DD/MM/YYYY h:mm A");

        case 'This Quarter':
          moment().endOf('quarter').format("DD/MM/YYYY h:mm A");

Я вибрав цей формат відповідно до своїх потреб. Ви можете змінити формат відповідно до ваших вимог.


2
        //get start of week; QT
    function _getStartOfWeek (date){
        var iDayOfWeek = date.getDay();
        var iDifference = date.getDate() - iDayOfWeek + (iDayOfWeek === 0 ?  -6:1);

        return new Date(date.setDate(iDifference));
    }, 

    function _getEndOfWeek(date){
        return new Date(date.setDate(date.getDate() + (7 - date.getDay()) === 7 ? 0 : (7 - date.getDay()) ));
    }, 

* поточна дата == 30.06.2016, а понеділок - перший день тижня.

Це також працює протягом різних місяців та років. Перевірено набором qunit:

введіть тут опис зображення

        QUnit.module("Planung: Start of week");
    QUnit.test("Should return start of week based on current date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date());
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.test("Should return start of week based on a sunday date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date("2016-07-03"));
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.test("Should return start of week based on a monday date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date("2016-06-27"));
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.module("Planung: End of week");
    QUnit.test("Should return end of week based on current date", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date());
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on sunday date with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-07-03"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on monday date with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-27"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 01-06-2016 with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-01"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 21-06-2016 with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-21"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 28-12-2016 with different month and year", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-12-28"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 01-01-2016 with different month and year", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-01-01"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });

2
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));

Це буде корисно для будь-якого сценарію дати.


1

Метод krtek має деякі помилки, я перевірив це

var startDay = 0; 
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (6 - today.getDay() - startDay) % 7);

це працює


1

Хоча питання здається застарілим, я повинен зазначити проблему.
Питання: Що станеться 1 січня 2016 року?
Думаю, більшість з наведених рішень розраховують початок тижня як 27.12.2016. З цієї причини, я думаю, правильний розрахунок повинен бути таким, як наведений нижче;

var d = new Date(),
    dayInMs = 1000 * 60 * 60 * 24,
    weekInMs = dayInMs * 7,
    startOfToday = new Date(d.getFullYear(), d.getMonth(), d.getDate()).valueOf(),
    todayElapsedTime = d.valueOf() - startOfToday,
    dayDiff = d.getDay() * dayInMs,
    dateDiff = dayDiff + todayElapsedTime, 
    // finally
    startOfWeek = d.valueOf() - dateDiff,
    endOfWeek = startOfWeek + weekInMs - 1;

0

Приємна пропозиція, але у вас була невелика проблема вчора. Вам слід змінити його на:

lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);

Не всі дні тривають 24 години, коли спостерігається перехід на літній час.
РобГ

0

Моментний підхід спрацював для мене у всіх випадках (хоча я не перевіряв межі, як кінець року, високосний рік). Тільки виправленням у наведеному вище коді є параметр "isoWeek", якщо ви хочете розпочати тиждень з понеділка.

    let startOfWeek = moment().startOf("isoWeek").toDate();
    let endOfWeek = moment().endOf("isoWeek").toDate();

0

Просто використовуючи чистий javascript, ви можете скористатися наведеною нижче функцією, щоб отримати перший день та останній день тижня з вільним встановленням дня для початку тижня.

var weekday = [];
weekday[0] = "Sunday";
weekday[1] = "Monday";
weekday[2] = "Tuesday";
weekday[3] = "Wednesday";
weekday[4] = "Thursday";
weekday[5] = "Friday";
weekday[6] = "Saturday";

function getFirstDayOfWeek(date, from) {
    //Default start week from 'Sunday'. You can change it yourself.
    from = from || 'Sunday'; 
    var index = weekday.indexOf(from);
    var start = index >= 0 ? index : 0;

    var d = new Date(date);
    var day = d.getDay();
    var diff = d.getDate() - day + (start > day ? start - 7 : start);
    d.setDate(diff);
    return d;
};

Останній день тижня - це лише 6 днів після першого дня тижня

function getLastDayOfWeek(date, from) {
    from = from || 'Sunday';
    var index = weekday.indexOf(from);
    var start = index >= 0 ? index : 0;

    var d = new Date(date);
    var day = d.getDay();
    var diff = d.getDate() - day + (start > day ? start - 1 : 6 + start);
    d.setDate(diff);
    return d;
};

Тест:

getFirstDayOfWeek('2017-10-16'); //--> Sun Oct 15 2017
getFirstDayOfWeek('2017-10-16', 'Monday'); //--> Mon Oct 16 2017
getFirstDayOfWeek('2017-10-16', 'Tuesday'); //--> Tue Oct 10 2017

0

JavaScript

function getWeekDays(curr, firstDay = 1 /* 0=Sun, 1=Mon, ... */) {
  var cd = curr.getDate() - curr.getDay();
  var from = new Date(curr.setDate(cd + firstDay));
  var to = new Date(curr.setDate(cd + 6 + firstDay));

  return {
    from,
    to,
  };
};

TypeScript

export enum WEEK_DAYS {
  Sunday = 0,
  Monday = 1,
  Tuesday = 2,
  Wednesday = 3,
  Thursday = 4,
  Friday = 5,
  Saturday = 6,
}

export const getWeekDays = (
  curr: Date,
  firstDay: WEEK_DAYS = WEEK_DAYS.Monday
): { from: Date; to: Date } => {
  const cd = curr.getDate() - curr.getDay();
  const from = new Date(curr.setDate(cd + firstDay));
  const to = new Date(curr.setDate(cd + 6 + firstDay));

  return {
    from,
    to,
  };
};

0

Ми додали код jquery, який показує поточний тиждень з понеділка по неділю.

var d = new Date();
var week = [];
var _days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var _months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
for (let i = 1; i <= 7; i++) {
    let first = d.getDate() - d.getDay() + i; 
    let dt = new Date(d.setDate(first));
    var _day = _days[dt.getDay()];
     var _month = _months[dt.getMonth()];
     var _date = dt.getDate();
     if(_date < 10 ){
         _date = '0' +_date;
     }
     var _year = dt.getFullYear();
     var fulldate = _day+' '+_month+' '+_date+' '+_year+' ';
     week.push(fulldate);
  }
console.log(week);

Цей код зберігає дні тижня в масиві з іменем тиждень. Формат дати, що зберігається в масиві, - Day Mon Date Year, означає, що він показує перший день тижня, потім місяць, дату та рік.
Neeraj Singh

Як це "код jQuery"? Існує безліч простих відповідей із використанням тієї самої техніки.
РобГ

0

Старе запитання з великою кількістю відповідей, тому інше не буде проблемою. Деякі загальні функції для отримання початку і кінця всіляких одиниць часу.

Для startOf і endOf тижня початковим днем ​​тижня за замовчуванням призначено неділю (0), але можна передати будь-який день (понеділок - 1, вівторок - 2 тощо). Однак використовує лише григоріанський календар.

Функції не мутують вихідну дату, тому, щоб перевірити, чи є дата в тому ж тижні, що і якась інша дата (тиждень, що починається в понеділок):

if (d >= startOf('week', d1, 1) && d <= endOf('week', d1, 1)) {
  // d is in same week as d1
}

або в поточному тижні, починаючи з неділі:

if (d >= startOf('week') && d <= endOf('week')) {
  // d is in the current week
}

// Returns a new Date object set to start of given unit
// For start of week, accepts any day as start
function startOf(unit, date = new Date(), weekStartDay = 0) {
  // Copy original so don't modify it
  let d = new Date(date);
  let e = new Date(d);
  e.setHours(23,59,59,999);
  // Define methods
  let start = {
    second: d => d.setMilliseconds(0),
    minute: d => d.setSeconds(0,0),
    hour  : d => d.setMinutes(0,0,0),
    day   : d => d.setHours(0,0,0,0),
    week  : d => {
      start.day(d);
      d.setDate(d.getDate() - d.getDay() + weekStartDay);
      if (d > e) d.setDate(d.getDate() - 7);
    },
    month : d => {
      start.day(d);
      d.setDate(1);
    },
    year  : d => {
      start.day(d);
      d.setMonth(0, 1);
    },
    decade: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 10);
    },
    century: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 100);
    },
    millenium: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 1000);
    }
  }
  start[unit](d);
  return d;
}

// Returns a new Date object set to end of given unit
// For end of week, accepts any day as start day
// Requires startOf
function endOf(unit, date = new Date(), weekStartDay = 0) {
  // Copy original so don't modify it
  let d = new Date(date);
  let e = new Date(date);
  e.setHours(23,59,59,999);
  // Define methods
  let end = {
    second: d => d.setMilliseconds(999),
    minute: d => d.setSeconds(59,999),
    hour  : d => d.setMinutes(59,59,999),
    day   : d => d.setHours(23,59,59,999),
    week  : w => {
      w = startOf('week', w, weekStartDay);
      w.setDate(w.getDate() + 6);
      end.day(w);
      d = w;
    },
    month : d => {
      d.setMonth(d.getMonth() + 1, 0);
      end.day(d);
    },  
    year  : d => {
      d.setMonth(11, 31);
      end.day(d);
    },
    decade: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 10 + 9);
    },
    century: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 100 + 99);
    },
    millenium: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 1000 + 999);
    }
  }
  end[unit](d);
  return d;
}

// Examples
let d = new Date();

['second','minute','hour','day','week','month','year',
 'decade','century','millenium'].forEach(unit => {
   console.log(('Start of ' + unit).padEnd(18)  + ': ' +
   startOf(unit, d).toString());
   console.log(('End of ' + unit).padEnd(18)  + ': ' +
   endOf(unit, d).toString());
});


0

Невелика зміна відповіді @Chris Lang. якщо ви хочете, щоб понеділок був першим днем, використовуйте це.

Date.prototype.GetFirstDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay()+ (this.getDay() == 0 ? -6:1) )));
}
Date.prototype.GetLastDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay() +7)));
}

var today = new Date();

alert(today.GetFirstDayOfWeek());

alert(today.GetLastDayOfWeek());

Такс @Chris Lang

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.