كيف يمكنني الحصول على الفرق بين تاريخين في JavaScript؟

StackOverflow https://stackoverflow.com/questions/41948

  •  09-06-2019
  •  | 
  •  

سؤال

أقوم بإنشاء تطبيق يتيح لك تحديد الأحداث بإطار زمني.أريد ملء تاريخ الانتهاء تلقائيًا عندما يقوم المستخدم بتحديد تاريخ البدء أو تغييره.ومع ذلك، لا أستطيع معرفة كيفية الحصول على الفرق بين الوقتين، ثم كيفية إنشاء تاريخ انتهاء جديد باستخدام هذا الاختلاف.

هل كانت مفيدة؟

المحلول

في JavaScript، يمكن تحويل التواريخ إلى عدد المللي ثانية منذ العصر الحديث عن طريق استدعاء getTime() طريقة أو فقط باستخدام التاريخ في تعبير رقمي.

للحصول على الفرق، فقط قم بطرح التاريخين.

لإنشاء تاريخ جديد بناءً على الفرق، ما عليك سوى تمرير عدد المللي ثانية في المُنشئ.

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

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

هذا يجب أن يعمل فقط

يحرر:تم إصلاح الخلل بواسطةbdukes

يحرر:

للحصول على تفسير للسلوك، oldBegin, oldEnd, ، و newBegin نكون Date الحالات.مشغلي المكالمات + و - سيؤدي إلى تشغيل خاصية Javascript التلقائية وسيقوم تلقائيًا باستدعاء valueOf() طريقة النموذج الأولي لتلك الكائنات.ويحدث أن valueOf() يتم تنفيذ الطريقة في Date كائن بمثابة دعوة ل getTime().

لذلك في الأساس: date.getTime() === date.valueOf() === (0 + date) === (+date)

نصائح أخرى

تدعم JavaScript اختلاف التاريخ بشكل مثالي

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

يوضح المثال الخاص بقبضتي قوة كائن التاريخ، لكنه يبدو في الواقع وكأنه قنبلة موقوتة

انظر العرض التوضيحي لـ JsFiddle

    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>

إذا كنت لا تهتم بمكون الوقت، يمكنك استخدامه .getDate() و .setDate() لتعيين جزء التاريخ فقط.

لذا، لتعيين تاريخ الانتهاء بعد أسبوعين من تاريخ البدء، قم بشيء مثل هذا:

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;
}

شكرًا @فنسنت روبرت, ، انتهى بي الأمر باستخدام المثال الأساسي الخاص بك، على الرغم من أنه في الواقع 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));
    }

اعتمادًا على احتياجاتك، ستقوم هذه الوظيفة بحساب الفرق بين اليومين، وإرجاع النتيجة بالأيام العشرية.

// 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));
}

إذا كنت تستخدم moment.js، فهناك حل أبسط، والذي سيمنحك الفرق في الأيام في سطر واحد من التعليمات البرمجية.

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

يمكن العثور على تفاصيل إضافية في صفحة moment.js

هتافات ، ميغيل

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);
}
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')
}

كود التعديل البديل الموسع..

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

يملأ هذا الرمز مدة سنوات الدراسة عند إدخال تاريخ البدء وتاريخ الانتهاء (تاريخ مؤهل مؤهل) للدراسة وتحقق مما إذا كانت المدة أقل من عام إذا كانت الإجابة بنعم ، فالأخذ في الاعتبار أن هناك ثلاثة عناصر إدخال في البداية 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;
        }
    }

إذا كنت تستخدم كائنات التاريخ ثم استخدم ملف getTime() وظيفة لكلا التاريخين ستعطيك الأوقات الخاصة بكل منهما منذ 1 يناير 1970 بقيمة رقمية.يمكنك بعد ذلك الحصول على الفرق بين هذه الأرقام.

إذا لم يساعدك ذلك، فاطلع على الوثائق الكاملة: http://www.w3schools.com/jsref/jsref_obj_date.asp

سيُرجع الكود أدناه الأيام المتبقية من اليوم إلى تاريخ العقود الآجلة.

التبعيات: مسج و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');
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);

هذا ما فعلته على نظامي.

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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top