2009-08-18 40 views
7

Tôi đang tìm cách để thực hiện phép trừ thích hợp giữa hai đối tượng Ngày javascript và nhận được delta ngày.trừ ngày javascript

Đây là cách tiếp cận của tôi, nhưng nó không thành công cho ngày todays như một đầu vào:

<script type="text/javascript"> 
function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
var incomingDate = new Date(incomingYear,incomingMonth,incomingDay); 
var today = new Date(); 

var delta = incomingDate - today; 
var resultDate = new Date(delta); 
return resultDate.getDate(); 
} 
//works for the future dates: 
alert(getDayDelta(2009,9,10)); 
alert(getDayDelta(2009,8,19)); 

//fails for the today as input, as expected 0 delta,instead gives 31: 
alert(getDayDelta(2009,8,18)); 
</script> 

Điều gì sẽ là một cách tiếp cận tốt hơn cho việc này?

Trả lời

7

Số tháng trong hàm ngày constructor là zero based, bạn nên trừ một, và tôi nghĩ rằng đó là đơn giản hơn để tính toán đồng bằng cách sử dụng dấu thời gian:

function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
    var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay), 
     today = new Date(), delta; 
    // EDIT: Set time portion of date to 0:00:00.000 
    // to match time portion of 'incomingDate' 
    today.setHours(0); 
    today.setMinutes(0); 
    today.setSeconds(0); 
    today.setMilliseconds(0); 

    // Remove the time offset of the current date 
    today.setHours(0); 
    today.setMinutes(0); 

    delta = incomingDate - today; 

    return Math.round(delta/1000/60/60/ 24); 
} 


getDayDelta(2008,8,18); // -365 
getDayDelta(2009,8,18); // 0 
getDayDelta(2009,9,18); // 31 
+0

cảm ơn bạn đã khắc phục nhưng điều này dường như không thành công tại: getDayDelta (2009,8,19); // nên trả về 1 nhưng trả về 0 (đó là 18 tại địa phương của tôi) – Hellnar

+0

Có, đó là vì 'ngày hôm nay' bao gồm thời gian, xem chỉnh sửa của tôi ... – CMS

+0

@Crib: Vấn đề là' incomingDate' có một phần thời gian của 0 giờ, 0 phút, 0 giây và 0 mili giây. Bạn phải làm tương tự với 'today' hoặc bạn sẽ nhận được một phần ngày cho một ngày trước/sau. Tôi đã chỉnh sửa câu trả lời để phản ánh thay đổi. –

5

Bạn có thể gọi hàm getTime() trên mỗi đối tượng ngày, sau đó trừ đi sau đó từ đối tượng ngày trước đó. Điều này sẽ cung cấp cho bạn số lượng mili giây khác nhau giữa hai đối tượng. Từ đó, thật dễ dàng để đến ngày.

Một vài trục trặc để theo dõi, mặc dù: 1) tiết kiệm ánh sáng ban ngày và 2) đảm bảo thời gian của bạn đến từ cùng múi giờ.

6

(2009,8,18) không phải là ngày 18 tháng 8. Đó là ngày 18 tháng 9.

+3

Các tháng là chỉ mục dựa trên không. 0 là tháng 1. – Sampson

+0

Điều này đúng với chức năng ngày tháng tháng không có chỉ mục. – MacAnthony

+1

oh javascript, bạn rất hài hước! – Rebs

0

này sẽ làm việc tốt hơn, nhưng nó doesn 't đúng đối phó với các giá trị kết quả tiêu cực. Bạn có thể muốn phân tích cú pháp các giá trị của chính mình và xử lý chúng.

function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay); 
var today = new Date(); 
today = new Date(Date.parse(today.format("yyyy/MM/dd"))); 

var delta = incomingDate - today; 
if (delta == 0) { return 0; } 
var resultDate = new Date(delta); 
return resultDate.getDate(); 
} 
//works for the future dates: 
alert(getDayDelta(2009,9,10)); 
alert(getDayDelta(2009,8,19)); 
alert(getDayDelta(2009, 8, 18)); 
+0

không phải là chức năng http://is.gd/2n46k – CMS

+0

Vậy tại sao nó hoạt động? (Môi trường của tôi là ASP.NET.) –

+1

Có, ASP .NET Ajax Framework mở rộng đối tượng Date phía máy khách – CMS