2009-12-28 212 views
47

如何找到兩個日期之間的差異?JavaScript中的日期差異

+0

[比較兩個使用JavaScript日期(的可能的複製https://stackoverflow.com/questions/492994/compare-two-dates-with-javascript ) – 2017-08-02 14:01:12

回答

88

通過使用Date對象及其毫秒值,差異可以計算:

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

然後,您可以通過將seconds 60,並獲得全minutes將其轉換爲整數,然後hoursminutes除以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. 

如果你想知道上面提供什麼樣的輸入參數第二Date object是,見下他們的名字:

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

在本解決方案的評論中指出,你不一定需要,除非他們是必要的,你要表示日期提供所有這些值。

+7

您不需要使用所有參數調用'Date'構造函數,只能使用Year和Month來調用它,其他參數是可選的。 – CMS 2009-12-28 06:27:55

+2

謝謝,CMS。我想確保用戶瞭解他們可以根據他們的規格獲得非常細微的信息。 – Sampson 2009-12-28 06:47:24

+1

我已更新解決方案以傳達您的觀點CMS。我很欣賞單挑。 – Sampson 2009-12-28 06:49:42

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

我發現這和正常工作對我來說:

計算兩個已知的日期之間的差異

不幸的是,計算日期間隔,例如兩個已知日期之間的日期,星期或月份並不容易,因爲您不能只將Date對象添加在一起。爲了在任何計算中使用Date對象,我們必須先檢索Date的內部毫秒值,該值存儲爲一個大整數。要做到這一點的函數是Date.getTime()。一旦兩個日期都進行了轉換,從較早的一箇中減去後面的一個將以毫秒爲單位返回差值。然後可以通過將該數字除以相應的毫秒數來確定期望的間隔。例如,爲了獲得用於毫秒的給定數目的天數,我們將通過86400000,毫秒的在一天的數目(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)); 

的舍入是可選的,取決於你是否想要部分日子。

Reference

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

如果你正在尋找一個差異表示爲年,月,日的組合,我建議這個功能:

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

這個解決方案將以我們自然會做的方式(我認爲)來對待閏年(2月29日)和月份長度差異。

因此,例如,2015年2月28日至2015年3月28日的時間間隔將被視爲恰好一個月,而不是28天。如果這兩天都在2016年,那麼差異仍然是一個月,而不是29天。

具有完全相同的月份和日期但不同年份的日期總是會有確切的年數差異。因此,2015-03-01和2016-03-01之間的差異將爲1年,而不是1年和1天(因爲365天爲1年)。

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

} 

用法

變種qtMonths = DateDiff的( '毫米',新的日期( '2015-05-05'),新的日期());

var qtYears = DateDiff('yy',new Date('2015-05-05'),new Date());

var qtDays = DateDiff('dd',new Date('2015-05-05'),new Date());

OR

變種qtMonths = DateDiff的( 'M',新的日期( '2015-05-05'),新的日期()); // m || y || d

var qtMonths = DateDiff('month',new Date('2015-05-05'),new Date()); //月||年||日期

var qtMonths = DateDiff('months',new Date('2015-05-05'),new 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; 

}