जावास्क्रिप्ट - वर्तमान तिथि से सप्ताह का पहला दिन मिलता है


161

मुझे सप्ताह का पहला दिन प्राप्त करने के लिए सबसे तेज़ तरीका चाहिए। उदाहरण के लिए: आज 11 नवंबर है, और गुरुवार है; और मैं इस सप्ताह का पहला दिन चाहता हूं, जो 8 नवंबर और सोमवार है। मैं MongoDB मानचित्र फ़ंक्शन, किसी भी विचार के लिए सबसे तेज़ विधि की आवश्यकता है?


यदि हर थोड़ी सी गति महत्वपूर्ण है, तो आप मेरे उत्तर का परीक्षण करना चाह सकते हैं। मैं ब्राउज़रों में खान के साथ थोड़ा बेहतर प्रदर्शन कर रहा हूं (आईई को छोड़कर, जो सीएमएस के पक्षधर हैं)। बेशक, आपको इसे MongoDB के साथ परीक्षण करने की आवश्यकता होगी। जब फ़ंक्शन सोमवार को एक तारीख बीत जाता है, तो यह और भी तेज होना चाहिए, क्योंकि यह सिर्फ अनमॉडिफाइड मूल तारीख लौटाता है।
user113716

मुझे एक ही समस्या मिली और क्योंकि जावास्क्रिप्ट तिथि ऑब्जेक्ट में बहुत सारे बग हैं जो मैं अब datejs.com (यहां code.google.com/p/datejs ) का उपयोग कर रहा हूं , एक पुस्तकालय जो मूल तिथि के मिस व्यवहार को सही करता है।
lolol

प्रश्न शीर्षक सप्ताह के पहले दिन के लिए पूछता है जबकि प्रश्न विवरण अंतिम सोमवार की तारीख के लिए पूछता है। ये वास्तव में दो अलग-अलग प्रश्न हैं। मेरे उत्तर की जाँच करें जो एक सही तरीके से उन दोनों को हल करता है।
लुइस एमलिन 19/18

जवाबों:


322

getDayदिनांक वस्तुओं की पद्धति का उपयोग करके , आप सप्ताह के दिन की संख्या (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

3
क्या इस फ़ंक्शन में बग है? - अगर सवाल में तारीख गुरुवार है 2, दिन = 4, diff = 2 - 4 + 1 = -1, और setDate का परिणाम (देखें 'पिछले महीने के अंतिम दिन से पहले दिन' होगा इस )।
इज़्हाकी

2
@ इज़हाकी आपका क्या मतलब है? 2 मई के लिए फ़ंक्शन 29 अप्रैल को लौटता है, जो सही है।
meze

14
यदि रविवार सप्ताह का पहला दिन है, तो उपयोग करें:diff = d.getDate() - day;
cfree

2
कोड @SMS के लिए धन्यवाद। मैंने सप्ताह के पहले दिन के ठीक 0 घंटे प्राप्त करने के लिए थोड़ा ट्विस्ट किया। d.setHours(0); d.setMinutes(0); d.setSeconds(0);
अवी

3
वैसे, d.setDate परस्पर है, यह "d" को स्वयं बदलता है
अय्याश

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
यह उत्तर होना चाहिए था, इसका एकमात्र ऐसा है जो पूछे गए प्रश्न का उत्तर देता है। दूसरे लोग छोटी गाड़ी हैं या आपको तीसरे पक्ष के पुस्तकालयों में भेजते हैं।
ओवरमारर्स

कूल यह मेरे लिए काम करता है! कुछ समायोजन करके मैं सप्ताह के सोमवार और शुक्रवार दोनों को एक निश्चित तारीख से ठंडा कर देता हूँ!
अलेवेंटुरायो

10
यह बहुत अच्छा है सिवाय इसके कि इस फ़ंक्शन को "setToMonday" कहा जाना चाहिए क्योंकि यह उस दिनांक ऑब्जेक्ट को संशोधित करता है, getMonday, एक नई तारीख लौटाएगा जो कि पास की गई तारीख के आधार पर सोमवार है। एक सूक्ष्म अंतर, लेकिन एक बार जिसने मुझे उपयोग करने के बाद पकड़ा। यह समारोह। सबसे आसान फिक्स date = new Date(date);getMonday फ़ंक्शन में पहली पंक्ति के रूप में रखना है।
शेन

यह कमाल का है। एक GetSunday विधि और भी आसान है! बहुत बहुत धन्यवाद!
जीससइम्सड्राइवर। डीएल

4
यह उत्तर गलत है क्योंकि सभी दिन में बचत के कारण 24 घंटे नहीं हैं। यह या तो आपकी तारीख के घंटे को अप्रत्याशित रूप से बदल सकता है या कुछ अवसरों पर गलत दिन भी लौटा सकता है।
लुई एमलिन

13

की जाँच करें Date.js

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

1
या हो सकता हैDate.parse('last monday');
अनुराग

मुझे इसके लिए MongoDB डेटाबेस की आवश्यकता है। इसलिए मैं date.js का संदर्भ नहीं दे सकता, लेकिन आपके कोड स्निपेट के लिए धन्यवाद।
आईएनएस

1
आह, मुझे नहीं पता था कि आप सीधे MongoDB में JS निष्पादित कर सकते हैं। यह बहुत चालाक है। मान लिया था कि आप क्वेरी डेटा तैयार करने के लिए JS का उपयोग कर रहे हैं।
मैट

JQuery की तरह, एक साधारण फ़ंक्शन तक पहुंचने के लिए पूरे पुस्तकालय (चाहे कितना छोटा हो) को नीचे खींचने में कोई दिलचस्पी नहीं है।
मफिन मैन

एक अच्छा समाधान नहीं है, क्योंकि देश हैं, सप्ताह का उनका पहला दिन रविवार है।
स्टेफन ब्रेंडल

11

सीएमएस का जवाब सही है लेकिन मान लिया है कि सोमवार सप्ताह का पहला दिन है।
Chandler Zwolle का उत्तर सही है लेकिन दिनांक प्रोटोटाइप के साथ फ़िडल्स।
अन्य उत्तर जो घंटे / मिनट / सेकंड / मिलीसेकंड के साथ खेलते हैं, गलत हैं।

नीचे दिया गया फ़ंक्शन सही है और पहले पैरामीटर के रूप में एक तारीख लेता है और दूसरे पैरामीटर के रूप में सप्ताह का पहला दिन (रविवार के लिए 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

यह फ़ंक्शन चालू सप्ताह को घटाने के लिए वर्तमान मिलीसेकंड समय का उपयोग करता है, और फिर एक और सप्ताह घटाता है यदि वर्तमान तिथि एक सोमवार (रविवार को जावास्क्रिप्ट से गिना जाता है)।

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 () में उन महीनों की सीमाओं के मुद्दे हैं जो ऊपर टिप्पणियों में नोट किए गए हैं। दिनांक ऑब्जेक्ट पर (आश्चर्यजनक रूप से काउंटरिंटुइएट) तरीकों के बजाय एपोक टाइमस्टैम्प का उपयोग करके एक स्पष्ट अंतर को खोजना है। अर्थात

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

बाहर की जाँच करें: पल। 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)

बोनस: नोड.जेएस के साथ भी काम करता है


18
हालांकि यह ओपी के सवाल का जवाब नहीं है। उसकी एक तिथि है, 08/07/14 (d / m / y) कहते हैं। वह इस सप्ताह का पहला दिन प्राप्त करना चाहता है (मेरे स्थान के लिए यह सोमवार होगा जो अभी बीत चुका है, या कल) पल के साथ उसके प्रश्न का उत्तर होगाmoment().startOf('week')
जेरोएन पेलग्रिम्स

ध्यान दें कि moment().startOf("week")स्थानीय सेटिंग्स के आधार पर, पिछले रविवार की तारीख दे सकते हैं। उस स्थिति में, moment().startOf('isoWeek')इसके बजाय का उपयोग करें : runkit.com/embed/wdpi4bjwh6rt
हरम ते

PS डॉक्स ऑन startOf(): momentjs.com/docs/#/manipulating/start-of
हरम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.