2009-12-28 46 views

Trả lời

88

Bằng việc sử dụng Date đối tượng và mili giây của nó giá trị, sự khác biệt có thể được tính:

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. 

Bạn có thể lấy số giây (như một số nguyên/số nguyên) bằng cách chia mili giây 1000 để chuyển đổi nó đến giây sau đó chuyển đổi kết quả để một số nguyên (điều này loại bỏ các phần phân đoạn đại diện cho mili giây):

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

sau đó, bạn có thể nhận được toàn bộ minutes bằng cách chia seconds 60 và chuyển đổi nó thành một số nguyên, sau đó hours bằng cách chia minutes cho 60 và chuyển đổi nó thành một số nguyên, sau đó đơn vị thời gian dài hơn theo cùng một cách. Từ đó, một chức năng để có được toàn bộ số tiền tối đa của một đơn vị thời gian trong giá trị của một đơn vị thấp hơn và thời gian còn lại đơn vị thấp hơn có thể được tạo ra:

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. 

Nếu bạn đang băn khoăn về các thông số đầu vào cung cấp ở trên cho thứ hai Date object là, nhìn thấy tên của họ dưới đây:

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

Như đã đề cập trong các ý kiến ​​của giải pháp này, bạn không nhất thiết cần phải cung cấp tất cả các giá trị, trừ khi họ đang cần thiết cho ngày bạn muốn để đại diện.

+7

Bạn không cần phải gọi hàm tạo 'Date' với tất cả các đối số, bạn có thể gọi nó chỉ với Năm và Tháng, các đối số khác là tùy chọn. – CMS

+2

Cảm ơn, CMS. Tôi muốn chắc chắn rằng người dùng hiểu rằng họ có thể rất chi tiết với đặc điểm kỹ thuật của họ. – Sampson

+1

Tôi đã cập nhật giải pháp để truyền đạt quan điểm của bạn, CMS. Tôi đánh giá cao những người đứng đầu. – Sampson

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

Tôi đã thấy điều này và nó hoạt động tốt đối với tôi:

Tính toán sự chênh giữa hai ngày Known

Thật không may, tính toán một khoảng ngày như ngày, tuần hoặc tháng giữa hai ngày đã biết không dễ dàng vì bạn không thể chỉ thêm các đối tượng Ngày cùng nhau. Để sử dụng một đối tượng Date trong bất kỳ kiểu tính toán nào, trước tiên chúng ta phải lấy giá trị mili giây nội bộ của Date, được lưu trữ như một số nguyên lớn. Hàm để làm điều đó là Date.getTime(). Một khi cả hai Ngày đã được chuyển đổi, trừ đi phần sau từ ngày trước, trả về sự khác biệt tính bằng mili giây. Khoảng thời gian mong muốn sau đó có thể được xác định bằng cách chia số đó cho số mili giây tương ứng. Ví dụ, để có được số lượng ngày đối với một số lượng nhất định của mili giây, chúng tôi sẽ chia cho 86.400.000, số mili giây trong một ngày (1000 x 60 giây x 60 phút x 24 giờ):

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

Các làm tròn là tùy chọn, tùy thuộc vào việc bạn muốn một phần ngày hay không.

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

Nếu bạn đang tìm kiếm một sự khác biệt thể hiện như một sự kết hợp của năm, tháng, và ngày này, tôi sẽ đề nghị chức năng này:

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

Giải pháp này sẽ xử lý những năm nhuận (29 tháng 2) và sự khác biệt về chiều dài theo tháng theo cách chúng ta sẽ tự nhiên làm (tôi nghĩ).

Ví dụ: khoảng thời gian từ ngày 28 tháng 2 năm 2015 đến ngày 28 tháng 3 năm 2015 sẽ được xem chính xác một tháng, không phải 28 ngày. Nếu cả hai ngày đó vào năm 2016, chênh lệch sẽ vẫn chính xác một tháng, không phải là 29 ngày.

Ngày chính xác cùng tháng và ngày, nhưng năm khác, sẽ luôn có sự khác biệt về số năm chính xác. Vì vậy, sự khác biệt giữa 2015-03-01 và 2016-03-01 sẽ là chính xác 1 năm, không phải 1 năm và 1 ngày (vì đếm 365 ngày là 1 năm).

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; 

} 

Cách sử dụng

var qtMonths = DATEDIFF ('mm', ngày mới ('2015/05/05'), new Date());

var qtYears = DateDiff ('yy', ngày mới ('2015-05-05'), ngày mới());

var qtDays = DateDiff ('dd', ngày mới ('2015-05-05'), ngày mới());

HOẶC

var qtMonths = DATEDIFF ('m', ngày mới ('2015/05/05'), new Date()); // m || y || d

var qtMonths = DateDiff ('month', new Date ('2015-05-05'), new Date()); // month || năm || ngày

var qtMonths = DateDiff ('tháng', ngày mới ('2015-05-05'), ngày mới()); // months || năm || ngày

...

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; 

} 
Các vấn đề liên quan