Мне нужен самый быстрый способ получить первый день недели. Например, сегодня 11 ноября и в четверг, мне нужно конвертировать эту дату в 8 ноября (понедельник). Мне нужен самый быстрый способ для функции карты MongoDB, любые идеи?
JavaScript - получить первый день недели с текущей даты
Ответ 1
Используя метод getDay
объектов Date, вы можете узнать количество дней недели (0 = воскресенье, 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
Ответ 2
Не уверен, как он сравнивается для производительности, но это работает.
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
Или как функция:
function getMonday( date ) {
var day = date.getDay() || 7;
if( day !== 1 )
date.setHours(-24 * (day - 1));
return date;
}
getMonday(new Date());
Ответ 3
Отъезд Date.js
Date.today().previous().monday()
Ответ 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;
}
Ответ 5
Отъезд: 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 тоже
Ответ 6
Эта функция использует текущее миллисекундное время для вычитания текущей недели, а затем вычитает еще одну неделю, если текущая дата находится в понедельник (число javascript подсчитывается с воскресенья).
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 millisecond for this week
var currentWeekDayMillisecond = ((currentDate.getDay()) * dayLength);
// subtract the current date with the current date 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;
}
Я тестировал его, когда неделя проходит через месяц (а также годы), и кажется, что она работает правильно.
Ответ 7
Добрый вечер,
Я предпочитаю просто иметь простой метод расширения:
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;
};
Теперь, если ваши недели начнутся в воскресенье, перейдите в параметр "0" для параметра pStartOfWeek, например:
var mThisSunday = new Date().startOfWeek(0);
Аналогично, если ваши недели начинаются в понедельник, перейдите в "1" для параметра pStartOfWeek:
var mThisMonday = new Date().startOfWeek(1);
Привет,
Ответ 8
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);
}
Ответ 9
Вот мое решение:
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;
}
Теперь вы можете выбрать дату по индексу возвращенного массива.
Ответ 10
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(weekStartDate.getDate()+6));
Это будет хорошо работать.