मुझे जावास्क्रिप्ट में दो तिथियों के बीच अंतर कैसे मिलेगा?


111

मैं एक एप्लिकेशन बना रहा हूं जो आपको एक समय सीमा के साथ घटनाओं को परिभाषित करने देता है। जब उपयोगकर्ता प्रारंभ तिथि को चुनता है या परिवर्तित करता है तो मैं स्वचालित रूप से अंतिम तिथि भरना चाहता हूं। हालांकि, मैं यह पता नहीं लगा सकता कि दोनों समय के बीच अंतर कैसे प्राप्त किया जाए, और फिर उस अंतर का उपयोग करके एक नई समाप्ति तिथि कैसे बनाई जाए।

जवाबों:


73

जावास्क्रिप्ट में, तारीखों को getTime()विधि के रूप में कॉल करके या केवल एक संख्यात्मक अभिव्यक्ति में तारीख का उपयोग करके मिलीसेकंड की संख्या में बदला जा सकता है ।

इसलिए अंतर पाने के लिए, बस दो तिथियों को घटाएं।

अंतर के आधार पर एक नई तारीख बनाने के लिए, बस कंस्ट्रक्टर में मिलीसेकंड की संख्या को पास करें।

var oldBegin = ...
var oldEnd = ...
var newBegin = ...

var newEnd = new Date(newBegin + oldEnd - oldBegin);

यह सिर्फ काम करना चाहिए

संपादित करें : फिक्स्ड बग @bdukes द्वारा इंगित किया गया

संपादित करें :

व्यवहार की एक विवरण के लिए, oldBegin, oldEnd, और newBeginकर रहे हैं Dateउदाहरणों। कॉल करने वाले ऑपरेटर +और -जावास्क्रिप्ट ऑटो कास्टिंग को ट्रिगर करेंगे और स्वचालित रूप valueOf()से उन वस्तुओं के प्रोटोटाइप विधि को कॉल करेंगे । ऐसा होता है कि valueOf()विधि को Dateकॉल के रूप में ऑब्जेक्ट में लागू किया जाता है getTime()

तो मूल रूप से: date.getTime() === date.valueOf() === (0 + date) === (+date)


.GetTime () को काम करने के लिए क्या प्रारूप आवश्यक है ... उदाहरण के लिए - नई तिथि ('22 -12-2012 00:00 ')। getTime () काम नहीं करेगा ... कोई विचार?
जिममाइट १

1
जेएस में तारीख करने के लिए, मेरा सुझाव है कि आप इस प्रश्न पर एक नज़र डालें: stackoverflow.com/questions/1576753/…
विन्सेन्ट रॉबर्ट

8
क्या OldBegin, OldEnd, और NewBegin Dateवस्तुओं को माना जाता है ? यह बताना कठिन है कि चर घोषणा किस प्रकार की होनी चाहिए, क्योंकि यहाँ चर घोषणा छोड़ दी गई है।
एंडरसन ग्रीन

इसके अलावा, एक फ़ंक्शन है जिसका उपयोग आप जावास्क्रिप्ट में दिनांक जोड़ने या घटाने के लिए कर सकते हैं: stackoverflow.com/a/1214753/975097
एंडरसन ग्रीन

संख्या और दिनों को जोड़ने के साथ सावधान रहें। स्पष्टीकरण के लिए मेरा जवाब नीचे देखें
Dan

24

जावास्क्रिप्ट बॉक्स से बाहर तारीख अंतर का पूरी तरह से समर्थन करता है

var msMinute = 60*1000, 
    msDay = 60*60*24*1000,
    a = new Date(2012, 2, 12, 23, 59, 59),
    b = new Date("2013 march 12");


console.log(Math.floor((b - a) / msDay) + ' full days between');
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between');

अब कुछ नुकसान। इसे इस्तेमाल करे:

console.log(a - 10);
console.log(a + 10);

इसलिए यदि आपके पास नंबर और दिनांक जोड़ने का जोखिम है, तो दिनांक को numberसीधे रूप में परिवर्तित करें ।

console.log(a.getTime() - 10);
console.log(a.getTime() + 10);

मेरा मुट्ठी उदाहरण डेट ऑब्जेक्ट की शक्ति को प्रदर्शित करता है लेकिन यह वास्तव में टाइम बम प्रतीत होता है


डैन, मुझे आपका उदाहरण समझने और अनुसरण करने में सबसे आसान लगा। धन्यवाद।
मेलानी

5
"नुकसान" वास्तव में भाषा विनिर्देश के आधार पर चूक हैं। घटाव ऑपरेटर -संख्या के लिए तर्कों को मजबूत करता है, इसलिए दिनांक अपना समय मान लौटाता है। +ऑपरेटर ओवरलोड हो गया है, इसलिए इसके नंबर या संयोजन करने के लिए बलात्कार कर सकते हैं,। चूंकि डेट्स इस मामले में स्ट्रिंग के लिए ज़बरदस्ती +करता है , इसलिए कॉन्टैक्शन करता है। कन्फ्यूजन डेट ऑब्जेक्ट की गलती नहीं है, बल्कि ओवरलोडिंग ऑपरेटरों की है।
रोबग

9

देखें JsFiddle DEMO

    var date1 = new Date();    
    var date2 = new Date("2025/07/30 21:59:00");
    //Customise date2 for your required future time

    showDiff();

function showDiff(date1, date2){

    var diff = (date2 - date1)/1000;
    diff = Math.abs(Math.floor(diff));

    var days = Math.floor(diff/(24*60*60));
    var leftSec = diff - days * 24*60*60;

    var hrs = Math.floor(leftSec/(60*60));
    var leftSec = leftSec - hrs * 60*60;

    var min = Math.floor(leftSec/(60));
    var leftSec = leftSec - min * 60;

    document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";

setTimeout(showDiff,1000);
}

आपके HTML कोड के लिए:

<div id="showTime"></div>

4

यदि आप समय घटक के बारे में परवाह नहीं करते हैं, तो आप उपयोग कर सकते हैं .getDate()और .setDate()बस दिनांक भाग सेट कर सकते हैं ।

तो अपनी शुरुआत की तारीख के 2 सप्ताह बाद अपनी अंतिम तिथि निर्धारित करें, कुछ इस तरह करें:

function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

दो तिथियों के बीच अंतर (दिनों में) वापस करने के लिए, यह करें:

function GetDateDiff(startDate, endDate)
{
    return endDate.getDate() - startDate.getDate();
}

अंत में, पहले फ़ंक्शन को संशोधित करते हैं ताकि यह पैरामीटर द्वारा 2 के रूप में लौटाया गया मान ले सके:

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}

31
GetDateDiff()महीने की बाधाओं को तोड़ देगा। उदाहरण के लिए, 2011/04/26 और 2011/05/01 -25 वापस आ जाएगा, लेकिन ऑफसेट 5 दिनों का होना चाहिए।
nfm

var ds = नई तिथि (2014, 0, 31, 0, 0, 0, 0); var de = नई तिथि (2014, 2, 31, 0, 0, 0, 0); GetDateDiff (ds, de) वापसी 0
नूर

3

धन्यवाद @ विंसेंट रॉबर्ट , मैं आपके मूल उदाहरण का उपयोग करके समाप्त हो गया, हालांकि यह वास्तव में है newBegin + oldEnd - oldBegin। यहाँ सरलीकृत अंत समाधान है:

    // don't update end date if there's already an end date but not an old start date
    if (!oldEnd || oldBegin) {
        var selectedDateSpan = 1800000; // 30 minutes
        if (oldEnd) {
            selectedDateSpan = oldEnd - oldBegin;
        }

       newEnd = new Date(newBegin.getTime() + selectedDateSpan));
    }

1
यह समझाने की अच्छी बात है कि आप कभी-कभी उपयोग क्यों कर रहे हैं getTimeऔर कभी-कभी नहीं
दान

2

आपकी आवश्यकताओं के आधार पर, यह फ़ंक्शन 2 दिनों के बीच के अंतर की गणना करेगा, और दिनों के दशमलव में परिणाम लौटाएगा।

// This one returns a signed decimal. The sign indicates past or future.

this.getDateDiff = function(date1, date2) {
    return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
}

// This one always returns a positive decimal. (Suggested by Koen below)

this.getDateDiff = function(date1, date2) {
    return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
}

1
इसे Math.abs()कॉल में रखें , और आपको हमेशा एक सकारात्मक दशमलव मिलेगा।
कोएन।

1
अच्छा सुझाव Koen। इससे लोगों को 2 विकल्प मिलते हैं: जैसा कि आपने सुझाव दिया है, बस सही तारीख में अंतर है, या संकेत के साथ एक दिनांकित है जो संकेत देता है कि अंतर अतीत या भविष्य में है। :)
स्पार्कस्पाइडर

कृपया ध्यान दें कि जावास्क्रिप्ट में आप date.getTime()भविष्य में / अतीत में समय पाने के लिए मिलीसेकंड में एक नंबर जोड़ / बदल सकते हैं । `var नेक्स्ट मिनट = नई तिथि (someDate.getTime () + 60 * 1000);
डैन

यह एक टाइपो है? "2 दिनों के बीच"। शायद 2 तारीखों के बीच।
टोमज़ाहलिन

2

यदि क्षण.js का उपयोग किया जाता है, तो एक सरल समाधान है, जो आपको कोड की एक एकल पंक्ति में दिनों में अंतर देगा।

moment(endDate).diff(moment(beginDate), 'days');

अतिरिक्त विवरण पल में पाया जा सकता है। जेएस पृष्ठ

चीयर्स, मिगुएल


1
function compare()
{
  var end_actual_time    = $('#date3').val();

  start_actual_time = new Date();
  end_actual_time = new Date(end_actual_time);

  var diff = end_actual_time-start_actual_time;

  var diffSeconds = diff/1000;
  var HH = Math.floor(diffSeconds/3600);
  var MM = Math.floor(diffSeconds%3600)/60;

  var formatted = ((HH < 10)?("0" + HH):HH) + ":" + ((MM < 10)?("0" + MM):MM)
  getTime(diffSeconds);
}
function getTime(seconds) {
  var days = Math.floor(leftover / 86400);

  //how many seconds are left
  leftover = leftover - (days * 86400);

  //how many full hours fits in the amount of leftover seconds
  var hours = Math.floor(leftover / 3600);

  //how many seconds are left
  leftover = leftover - (hours * 3600);

  //how many minutes fits in the amount of leftover seconds
  var minutes = leftover / 60;

  //how many seconds are left
  //leftover = leftover - (minutes * 60);
  alert(days + ':' + hours + ':' + minutes);
}

1

वैकल्पिक modificitaion विस्तारित कोड ..

http://jsfiddle.net/vvGPQ/48/

showDiff();

function showDiff(){
var date1 = new Date("2013/01/18 06:59:00");   
var date2 = new Date();
//Customise date2 for your required future time

var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));

var years = Math.floor(diff/(365*24*60*60));
var leftSec = diff - years * 365*24*60*60;

var month = Math.floor(leftSec/((365/12)*24*60*60));
var leftSec = leftSec - month * (365/12)*24*60*60;    

var days = Math.floor(leftSec/(24*60*60));
var leftSec = leftSec - days * 24*60*60;

var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;

var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;




document.getElementById("showTime").innerHTML = "You have " + years + " years "+ month + " month " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds the life time has passed.";

setTimeout(showDiff,1000);
}

कृपया अपने उत्तर में और स्पष्टीकरण जोड़ें और बेहतर अंग्रेजी का उपयोग करें।
निधि मोनिका का मुकदमा

यह समाधान गलत है क्योंकि आप 365 दिनों का उपयोग करते हैं, लीप वर्षों की उपेक्षा करते हैं।
सर्गेई Goliney

0
function checkdate() {
    var indate = new Date()
    indate.setDate(dat)
    indate.setMonth(mon - 1)
    indate.setFullYear(year)

    var one_day = 1000 * 60 * 60 * 24
    var diff = Math.ceil((indate.getTime() - now.getTime()) / (one_day))
    var str = diff + " days are remaining.."
    document.getElementById('print').innerHTML = str.fontcolor('blue')
}

0
<html>
<head>
<script>
function dayDiff()
{
     var start = document.getElementById("datepicker").value;
     var end= document.getElementById("date_picker").value;
     var oneDay = 24*60*60*1000; 
     var firstDate = new Date(start);
     var secondDate = new Date(end);    
     var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    document.getElementById("leave").value =diffDays ;
 }
</script>
</head>
<body>
<input type="text" name="datepicker"value=""/>
<input type="text" name="date_picker" onclick="function dayDiff()" value=""/>
<input type="text" name="leave" value=""/>
</body>
</html>

0

यह कोड अध्ययन की वर्षों की अवधि को भरता है जब आप अध्ययन की आरंभ तिथि और अंतिम तिथि (अर्हताप्राप्त तिथि) का इनपुट करते हैं और जाँचते हैं कि क्या एक वर्ष से कम की अवधि यदि हाँ संदेश को ध्यान में रखते हुए तीन इनपुट तत्व पहले txtFromQualifDateऔर दूसरा txtQualifDateऔर तीसराtxtStudyYears

यह अंश के साथ वर्षों की संख्या का परिणाम दिखाएगा

function getStudyYears()
    {
        if(document.getElementById('txtFromQualifDate').value != '' && document.getElementById('txtQualifDate').value != '')
        {
            var d1 = document.getElementById('txtFromQualifDate').value;

            var d2 = document.getElementById('txtQualifDate').value;

            var one_day=1000*60*60*24;

            var x = d1.split("/");
            var y = d2.split("/");

            var date1=new Date(x[2],(x[1]-1),x[0]);

            var date2=new Date(y[2],(y[1]-1),y[0])

            var dDays = (date2.getTime()-date1.getTime())/one_day;

            if(dDays < 365)
            {
                alert("the date between start study and graduate must not be less than a year !");

                document.getElementById('txtQualifDate').value = "";
                document.getElementById('txtStudyYears').value = "";

                return ;
            }

            var dMonths = Math.ceil(dDays / 30);

            var dYears = Math.floor(dMonths /12) + "." + dMonths % 12;

            document.getElementById('txtStudyYears').value = dYears;
        }
    }

1
कभी भी वर्ष खोजने के लिए तार तार नहीं करें क्योंकि स्ट्रिंग उपस्थिति (esp। विभाजक) ब्राउज़रों के बीच भिन्न होती है। उपयोग करें getFullYearजो उस के लिए डिज़ाइन किया गया था। ------- googlecode पर datejs लाइब्रेरी देखें, जो संभवतः सबसे कोने के मामलों का समर्थन करता है
Dan

सलाह के लिए धन्यवाद @ दान, लेकिन यह काम किया और मेरे लिए परीक्षण किया असली शासन परियोजना (विभिन्न ब्राउज़रों) पर है कि कमजोर प्रोग्रामिंग प्रैक्टिकल? :)
शैरफ

0

यदि आप दिनांक ऑब्जेक्ट का उपयोग करते हैं और फिर getTime()दोनों तिथियों के लिए फ़ंक्शन का उपयोग करते हैं, तो यह आपको 1 जनवरी, 1970 से एक नंबर मूल्य में अपने संबंधित समय देगा। फिर आप इन संख्याओं के बीच अंतर प्राप्त कर सकते हैं।

यदि वह आपकी सहायता नहीं करता है, तो संपूर्ण दस्तावेज़ देखें: http://www.w3schools.com/jsref/jsref_obj_date.asp


ओह, हाँ, ध्यान नहीं दिया, इस एक से नीचे के उत्तर सबसे अधिक आधे साल पुराने हैं।
कोएन।

0

नीचे दिया गया कोड आज से वायदा तिथि तक के दिनों को वापस कर देगा।

निर्भरताएँ: jQuery और MomentJs।

var getDaysLeft = function (date) {
  var today = new Date();
  var daysLeftInMilliSec = Math.abs(new Date(moment(today).format('YYYY-MM-DD')) - new Date(date));
  var daysLeft = daysLeftInMilliSec / (1000 * 60 * 60 * 24);   
  return daysLeft;
};

getDaysLeft('YYYY-MM-DD');

0
var getDaysLeft = function (date1, date2) {
   var daysDiffInMilliSec = Math.abs(new Date(date1) - new Date(date2));
   var daysLeft = daysDiffInMilliSec / (1000 * 60 * 60 * 24);   
   return daysLeft;
};
var date1='2018-05-18';
var date2='2018-05-25';
var dateDiff = getDaysLeft(date1, date2);
console.log(dateDiff);

0

यह मेरे सिस्टम पर क्या है?

var startTime=("08:00:00").split(":");
var endTime=("16:00:00").split(":");
var HoursInMinutes=((parseInt(endTime[0])*60)+parseInt(endTime[1]))-((parseInt(startTime[0])*60)+parseInt(startTime[1]));
console.log(HoursInMinutes/60);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.