سؤال

كيف تجد الفرق بين تاريخين؟

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

المحلول

باستخدام تاريخ الكائن وقيمة ميلي ثانية ، يمكن حساب الاختلافات:

var a = new Date(); // Current date now.
var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.
var d = (b-a); // Difference in milliseconds.

يمكنك الحصول على عدد الثواني (كرقم صحيح/كامل) بتقسيم المللي ثانية على 1000 لتحويله إلى ثوان ثم تحويل النتيجة إلى عدد صحيح (هذا يزيل الجزء الكسري الذي يمثل المللي ثانية):

var seconds = parseInt((b-a)/1000);

يمكنك بعد ذلك الحصول على كامل minutes بقسمة seconds بحلول 60 وتحويله إلى عدد صحيح ، ثم hours بقسمة minutes بحلول 60 وتحويله إلى عدد صحيح ، ثم وحدات زمنية أطول بنفس الطريقة. من هذا ، وظيفة للحصول على الحد الأقصى الكامل للوحدة الزمنية في قيمة الوحدة السفلية ويمكن إنشاء الوحدة السفلية الباقية:

function get_whole_values(base_value, time_fractions) {
    time_data = [base_value];
    for (i = 0; i < time_fractions.length; i++) {
        time_data.push(parseInt(time_data[i]/time_fractions[i]));
        time_data[i] = time_data[i] % time_fractions[i];
    }; return time_data;
};
// Input parameters below: base value of 72000 milliseconds, time fractions are
// 1000 (amount of milliseconds in a second) and 60 (amount of seconds in a minute). 
console.log(get_whole_values(72000, [1000, 60]));
// -> [0,12,1] # 0 whole milliseconds, 12 whole seconds, 1 whole minute.

إذا كنت تتساءل ما هي معلمات الإدخال المقدمة أعلاه للثانية كائن التاريخ هم ، انظر أسمائهم أدناه:

new Date(<year>, <month>, <day>, <hours>, <minutes>, <seconds>, <milliseconds>);

كما هو مذكور في تعليقات هذا الحل ، لا تحتاج بالضرورة إلى توفير كل هذه القيم ما لم تكن ضرورية للتاريخ الذي ترغب في تمثيله.

نصائح أخرى

لقد وجدت هذا وهو يعمل بشكل جيد بالنسبة لي:

حساب الفرق بين تواريخين معروفين

لسوء الحظ ، فإن حساب الفاصل الزمني للتاريخ مثل الأيام أو الأسابيع أو الشهور بين تاريخين معروفين ليس بالأمر السهل لأنه لا يمكنك إضافة كائنات التاريخ معًا. من أجل استخدام كائن تاريخ في أي نوع من الحساب ، يجب علينا أولاً استرداد قيمة الميلي ثانية الداخلية للتاريخ ، والتي يتم تخزينها كصاحب صحيح كبير. الوظيفة للقيام بذلك هي Date.getTime (). بمجرد تحويل كلا التواريخ ، يطرح طرح اللاحق من واحد السابق الفرق بالميلي ثانية. يمكن بعد ذلك تحديد الفاصل الزمني المطلوب من خلال تقسيم هذا الرقم على العدد المقابل للمللي ثانية. على سبيل المثال ، للحصول على عدد الأيام لعدد معين من المللي ثانية ، سنقسم على 86،400،000 ، عدد المللي ثانية في اليوم (1000 × 60 ثانية × 60 دقيقة × 24 ساعة):

Date.daysBetween = function( date1, date2 ) {
  //Get 1 day in milliseconds
  var one_day=1000*60*60*24;

  // Convert both dates to milliseconds
  var date1_ms = date1.getTime();
  var date2_ms = date2.getTime();

  // Calculate the difference in milliseconds
  var difference_ms = date2_ms - date1_ms;

  // Convert back to days and return
  return Math.round(difference_ms/one_day); 
}

//Set the two dates
var y2k  = new Date(2000, 0, 1); 
var Jan1st2010 = new Date(y2k.getFullYear() + 10, y2k.getMonth(), y2k.getDate());
var today= new Date();
//displays 726
console.log( 'Days since ' 
           + Jan1st2010.toLocaleDateString() + ': ' 
           + Date.daysBetween(Jan1st2010, today));

التقريب اختياري ، اعتمادًا على ما إذا كنت تريد أيامًا جزئية أم لا.

المرجعي

    // This is for first date
    first = new Date(2010, 03, 08, 15, 30, 10); // Get the first date epoch object
    document.write((first.getTime())/1000); // get the actual epoch values
    second = new Date(2012, 03, 08, 15, 30, 10); // Get the first date epoch object
    document.write((second.getTime())/1000); // get the actual epoch values
    diff= second - first ;
    one_day_epoch = 24*60*60 ;  // calculating one epoch
    if ( diff/ one_day_epoch > 365 ) // check , is it exceei
    {
    alert( 'date is exceeding one year');
    }

إذا كنت تبحث عن اختلاف معبر عنه كمجموعة من السنوات والشهور والأيام ، أقترح هذه الوظيفة:

function interval(date1, date2) {
    if (date1 > date2) { // swap
        var result = interval(date2, date1);
        result.years  = -result.years;
        result.months = -result.months;
        result.days   = -result.days;
        result.hours  = -result.hours;
        return result;
    }
    result = {
        years:  date2.getYear()  - date1.getYear(),
        months: date2.getMonth() - date1.getMonth(),
        days:   date2.getDate()  - date1.getDate(),
        hours:  date2.getHours() - date1.getHours()
    };
    if (result.hours < 0) {
        result.days--;
        result.hours += 24;
    }
    if (result.days < 0) {
        result.months--;
        // days = days left in date1's month, 
        //   plus days that have passed in date2's month
        var copy1 = new Date(date1.getTime());
        copy1.setDate(32);
        result.days = 32-date1.getDate()-copy1.getDate()+date2.getDate();
    }
    if (result.months < 0) {
        result.years--;
        result.months+=12;
    }
    return result;
}

// Be aware that the month argument is zero-based (January = 0)
var date1 = new Date(2015, 4-1, 6);
var date2 = new Date(2015, 5-1, 9);

document.write(JSON.stringify(interval(date1, date2)));

سيتعامل هذا الحل مع سنوات القفزة (29 فبراير) واختلافات طول الشهر بطريقة نفعلها بشكل طبيعي (على ما أظن).

على سبيل المثال ، سيتم اعتبار الفاصل الزمني بين 28 فبراير 2015 و 28 مارس 2015 شهرًا واحدًا بالضبط ، وليس 28 يومًا. إذا كان كلتا اليومين في عام 2016 ، فسيظل الفرق هو شهر واحد بالضبط ، وليس 29 يومًا.

تواريخ مع نفس الشهر واليوم بالضبط ، ولكن سنة مختلفة ، سيكون لها دائمًا فرق في عدد السنوات الدقيقة. وبالتالي فإن الفرق بين 2015-03-01 و 2016-03-01 سيكون بالضبط سنة واحدة ، وليس سنة واحدة ويوم واحد (بسبب حساب 365 يومًا لمدة سنة واحدة).

هذه الإجابة ، استنادًا إلى آخر (رابط في النهاية) ، تدور حول الفرق بين تاريخين.
يمكنك أن ترى كيف يعمل لأنه بسيط ، كما أنه يتضمن تقسيم الفرق إلى
وحدات من الوقت (وظيفة قمت بها) والتحويل إلى UTC لوقف مشاكل المنطقة الزمنية.

function date_units_diff(a, b, unit_amounts) {
    var split_to_whole_units = function (milliseconds, unit_amounts) {
        // unit_amounts = list/array of amounts of milliseconds in a
        // second, seconds in a minute, etc., for example "[1000, 60]".
        time_data = [milliseconds];
        for (i = 0; i < unit_amounts.length; i++) {
            time_data.push(parseInt(time_data[i] / unit_amounts[i]));
            time_data[i] = time_data[i] % unit_amounts[i];
        }; return time_data.reverse();
    }; if (unit_amounts == undefined) {
        unit_amounts = [1000, 60, 60, 24];
    };
    var utc_a = new Date(a.toUTCString());
    var utc_b = new Date(b.toUTCString());
    var diff = (utc_b - utc_a);
    return split_to_whole_units(diff, unit_amounts);
}

// Example of use:
var d = date_units_diff(new Date(2010, 0, 1, 0, 0, 0, 0), new Date()).slice(0,-2);
document.write("In difference: 0 days, 1 hours, 2 minutes.".replace(
   /0|1|2/g, function (x) {return String( d[Number(x)] );} ));

كيف يعمل الكود أعلاه

يمكن حساب اختلاف التاريخ/الوقت ، مثل المللي ثانية ، باستخدام تاريخ هدف:

var a = new Date(); // Current date now.
var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.

var utc_a = new Date(a.toUTCString());
var utc_b = new Date(b.toUTCString());
var diff = (utc_b - utc_a); // The difference as milliseconds.

ثم لوضع عدد الثواني في هذا الاختلاف ، قسّمه على 1000 إلى تحويله
ميلي ثانية إلى ثوانٍ ، ثم قم بتغيير النتيجة إلى عدد صحيح (رقم كامل) لإزالته
المللي ثانية (جزء من هذا العشرية): var seconds = parseInt(diff/1000).
أيضًا ، يمكنني الحصول على وحدات زمنية أطول باستخدام نفس العملية ، على سبيل المثال:
- (كل) الدقائق, ، تقسيم ثوان بحلول 60 وتغيير النتيجة إلى عدد صحيح ،
- ساعات, ، تقسيم الدقائق بحلول 60 وتغيير النتيجة إلى عدد صحيح.

لقد قمت بإنشاء وظيفة للقيام بهذه العملية لتقسيم الفرق إلى
وحدات زمنية كاملة ، اسمها split_to_whole_units, ، مع هذا العرض التوضيحي:

console.log(split_to_whole_units(72000, [1000, 60]));
// -> [1,12,0] # 1 (whole) minute, 12 seconds, 0 milliseconds.

تستند هذه الإجابة على هذا الآخر.

Date.prototype.addDays = function(days) {

   var dat = new Date(this.valueOf())
   dat.setDate(dat.getDate() + days);
   return dat;
}

function getDates(startDate, stopDate) {

  var dateArray = new Array();
  var currentDate = startDate;
  while (currentDate <= stopDate) {
    dateArray.push(currentDate);
    currentDate = currentDate.addDays(1);
  }
  return dateArray;
}

var dateArray = getDates(new Date(), (new Date().addDays(7)));

for (i = 0; i < dateArray.length; i ++ ) {
  //  alert (dateArray[i]);

    date=('0'+dateArray[i].getDate()).slice(-2);
    month=('0' +(dateArray[i].getMonth()+1)).slice(-2);
    year=dateArray[i].getFullYear();
    alert(date+"-"+month+"-"+year );
}
var DateDiff = function(type, start, end) {

    let // or var
        years = end.getFullYear() - start.getFullYear(),
        monthsStart = start.getMonth(),
        monthsEnd = end.getMonth()
    ;

    var returns = -1;

    switch(type){
        case 'm': case 'mm': case 'month': case 'months':
            returns = ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) );
            break;
        case 'y': case 'yy': case 'year': case 'years':
            returns = years;
            break;
        case 'd': case 'dd': case 'day': case 'days':
            returns = ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) );
            break;
    }

    return returns;

}

الاستخدام

var qtmonths = datediff ('mm' ، تاريخ جديد ('2015-05-05') ، date ()) ؛

var qtyears = datediff ('yy' ، تاريخ جديد ('2015-05-05') ، date ()) ؛

var qtdays = datediff ('dd' ، تاريخ جديد ('2015-05-05') ، date ()) ؛

أو

var qtmonths = datediff ('m' ، تاريخ جديد ('2015-05-05') ، date ()) ؛ // م || ص || د

var qtmonths = datediff ('month' ، تاريخ جديد ('2015-05-05') ، date ()) ؛ // شهر || سنة || يوم

var qtmonths = datediff ('أشهر' ، تاريخ جديد ('2015-05-05') ، date ()) ؛ // أشهر || سنوات || أيام

...

var DateDiff = function (type, start, end) {

    let // or var
        years = end.getFullYear() - start.getFullYear(),
        monthsStart = start.getMonth(),
        monthsEnd = end.getMonth()
    ;

    if(['m', 'mm', 'month', 'months'].includes(type)/*ES6*/)
        return ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) );
    else if(['y', 'yy', 'year', 'years'].includes(type))
        return years;
    else if (['d', 'dd', 'day', 'days'].indexOf(type) !== -1/*EARLIER JAVASCRIPT VERSIONS*/)
        return ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) );
    else
        return -1;

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top