Haftanın ilk gününü almanın en hızlı yoluna ihtiyacım var. Örneğin: bugün 11 Kasım ve Perşembe; 8 Kasım olan bu haftanın ilk gününü ve Pazartesi gününü istiyorum. MongoDB harita fonksiyonu için en hızlı yönteme ihtiyacım var, herhangi bir fikir?
Haftanın ilk gününü almanın en hızlı yoluna ihtiyacım var. Örneğin: bugün 11 Kasım ve Perşembe; 8 Kasım olan bu haftanın ilk gününü ve Pazartesi gününü istiyorum. MongoDB harita fonksiyonu için en hızlı yönteme ihtiyacım var, herhangi bir fikir?
Yanıtlar:
getDayDate nesneleri yöntemini kullanarak, haftanın gün sayısını öğrenebilirsiniz (0 = Pazar, 1 = Pazartesi, vb.).
Daha sonra bu gün sayısını artı bir tane çıkarabilirsiniz, örneğin:
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
diff = d.getDate() - day;
d.setHours(0); d.setMinutes(0); d.setSeconds(0);
Performans için nasıl karşılaştırıldığından emin değilim, ama bu işe yarıyor.
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
Veya bir işlev olarak:
# modifies _date_
function setToMonday( date ) {
var day = date.getDay() || 7;
if( day !== 1 )
date.setHours(-24 * (day - 1));
return date;
}
setToMonday(new Date());
date = new Date(date);getMonday işlevinde ilk satır olarak koymaktır.
Date.js'ye göz atın
Date.today().previous().monday()
Date.parse('last monday');
CMS'nin yanıtı doğru ancak Pazartesi gününün haftanın ilk günü olduğunu varsayar.
Chandler Zwolle'un cevabı doğrudur ancak Date prototipiyle uğraşır.
Saat / dakika / saniye / milisaniye ile oynayan diğer cevaplar yanlıştır.
Aşağıdaki işlev doğrudur ve ilk parametre olarak bir tarih ve ikinci parametre olarak istenen haftanın ilk günü alır (Pazar için 0, Pazartesi için 1, vb.). Not: saat, dakika ve saniye, gün başlangıcı için 0 olarak ayarlanmıştır.
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)
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));
Bu iyi işleyecek.
Bu işlev, geçerli haftayı çıkarmak için geçerli milisaniye süresini kullanır ve geçerli tarih pazartesi günü ise bir hafta daha çıkarır (javascript pazardan sayar).
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;
}
Hafta bir aydan diğerine (ve yıllara) yayıldığında test ettim ve düzgün çalışıyor gibi görünüyor.
İyi akşamlar,
Ben sadece basit bir uzantı yöntemi var tercih ederim:
Date.prototype.startOfWeek = function (pStartOfWeek) {
var mDifference = this.getDay() - pStartOfWeek;
if (mDifference < 0) {
mDifference += 7;
}
return new Date(this.addDays(mDifference * -1));
}
Bunun aslında kullandığım başka bir uzantı yöntemini kullandığını göreceksiniz:
Date.prototype.addDays = function (pDays) {
var mDate = new Date(this.valueOf());
mDate.setDate(mDate.getDate() + pDays);
return mDate;
};
Şimdi, haftalarınız Pazar günü başlıyorsa, pStartOfWeek parametresi için "0" değerini girin, şöyle:
var mThisSunday = new Date().startOfWeek(0);
Benzer şekilde, haftalarınız Pazartesi günü başlıyorsa, pStartOfWeek parametresi için bir "1" iletin:
var mThisMonday = new Date().startOfWeek(1);
Saygılarımızla,
Bugünden itibaren haftanın ilk gününün tarihini almak için şöyle bir şey kullanabilirsiniz:
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());
Ya da haftanın son gününü bugünden almak için:
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());
* Saat diliminize bağlı olarak, haftanın başlangıcı Pazar günü başlamak zorunda değildir, Cuma, Cumartesi, Pazartesi veya makinenizin ayarlandığı başka bir günde başlayabilir. Bu yöntemler bunu açıklayacaktır.
* Şöyle toISOStringyöntem kullanarak da biçimlendirebilirsiniz :getLastSunday().toISOString()
setDate () yöntemi, yukarıdaki açıklamalarda belirtilen ay sınırları ile ilgili sorunlara sahiptir. Temiz bir çözüm, Date nesnesindeki (şaşırtıcı derecede sezgisel) yöntemler yerine dönem zaman damgalarını kullanarak tarih farkını bulmaktır. yani
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);
}
İşte benim çözümüm:
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;
}
Artık döndürülen dizi dizinine göre tarih seçebilirsiniz.
Herhangi bir Dateişlevi olmayan sadece matematiksel hesaplamaya bir örnek .
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
bunun daha genelleştirilmiş bir sürümü ... bu, belirttiğiniz güne göre geçerli haftanın herhangi bir gününü verecektir.
//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);
Kontrol et: moment.js
Misal:
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)
Bonus: node.js ile de çalışır
moment().startOf('week')
moment().startOf("week")Yerel ayarlara bağlı olarak, önceki Pazar gününün tarihini verebileceğini unutmayın . Bu durumda, moment().startOf('isoWeek')bunun yerine kullanın: runkit.com/embed/wdpi4bjwh6rt
startOf(): momentjs.com/docs/#/manipulating/start-of