Làm cách nào để nhận được sự khác biệt giữa hai Ngày trong JavaScript?


111

Tôi đang tạo một ứng dụng cho phép bạn xác định các sự kiện với một khung thời gian. Tôi muốn tự động điền ngày kết thúc khi người dùng chọn hoặc thay đổi ngày bắt đầu. Tuy nhiên, tôi không thể tìm ra cách để có được sự khác biệt giữa hai thời điểm và sau đó làm thế nào để tạo Ngày kết thúc mới bằng cách sử dụng sự khác biệt đó.

Câu trả lời:


73

Trong JavaScript, ngày có thể được chuyển đổi thành số mili giây kể từ epoc bằng cách gọi getTime()phương thức hoặc chỉ sử dụng ngày trong biểu thức số.

Vì vậy, để có được sự khác biệt, chỉ cần trừ hai ngày.

Để tạo một ngày mới dựa trên sự khác biệt, chỉ cần chuyển số mili giây vào hàm tạo.

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

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

Điều này sẽ hoạt động

CHỈNH SỬA : Đã sửa lỗi do @bdukes chỉ ra

CHỈNH SỬA :

Để giải thích về hành vi, oldBegin, oldEnd, và newBeginDatetrường hợp. Gọi các toán tử +-sẽ kích hoạt tự động truyền Javascript và sẽ tự động gọi valueOf()phương thức nguyên mẫu của các đối tượng đó. Nó xảy ra rằng valueOf()phương thức được thực hiện trong Dateđối tượng như một lời gọi đến getTime().

Nên về cơ bản: date.getTime() === date.valueOf() === (0 + date) === (+date)


Định dạng bắt buộc để .getTime () hoạt động là gì ... Ví dụ - new Date ('22-12-2012 00:00'). GetTime () sẽ không hoạt động ... Có ý kiến ​​gì không?
Jimmyt1988 18/09/12

1
Đối với ngày phân tích cú pháp trong JS, tôi đề nghị bạn có một cái nhìn cho câu hỏi này: stackoverflow.com/questions/1576753/...
Vincent Robert

8
OldBegin, oldEnd và NewBegin có phải là Datecác đối tượng không? Thật khó để biết chúng phải là loại đối tượng nào, vì phần khai báo biến bị bỏ qua ở đây.
Anderson Green

Ngoài ra, có một chức năng mà bạn có thể sử dụng để thêm hoặc trừ ngày tháng trong JavaScript: stackoverflow.com/a/1214753/975097
Anderson Green

Hãy cẩn thận với việc thêm số và ngày. Xem câu trả lời của tôi bên dưới để giải thích
Dan

24

JavaScript hỗ trợ hoàn hảo sự khác biệt về ngày tháng

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

Bây giờ một số cạm bẫy. Thử cái này:

console.log(a - 10);
console.log(a + 10);

Vì vậy, nếu bạn có nguy cơ thêm một số và Ngày, hãy chuyển đổi Ngày thành numbertrực tiếp.

console.log(a.getTime() - 10);
console.log(a.getTime() + 10);

Ví dụ nắm tay của tôi thể hiện sức mạnh của đối tượng Date nhưng nó thực sự có vẻ là một quả bom hẹn giờ


Dan, tôi thấy ví dụ của bạn là dễ hiểu và dễ làm theo nhất. Cảm ơn.
Melanie

5
Các "cạm bẫy" thực sự là mặc định dựa trên đặc điểm ngôn ngữ. Toán tử phép trừ -buộc các đối số thành số, do đó Ngày trả về giá trị thời gian của nó. Các +nhà điều hành bị quá tải, vì vậy có thể làm thêm, ép buộc đến số hoặc nối. Vì Ngày bắt buộc đối với Chuỗi trong trường hợp này, nên +nối. Nhầm lẫn không phải là lỗi của đối tượng Date mà là do nạp chồng các toán tử.
RobG

9

Xem JsFiddle DEMO

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

cho Mã HTML của bạn:

<div id="showTime"></div>

4

Nếu bạn không quan tâm đến thành phần thời gian, bạn có thể sử dụng .getDate().setDate()chỉ đặt phần ngày.

Vì vậy, để đặt ngày kết thúc thành 2 tuần sau ngày bắt đầu, hãy làm như sau:

function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

Để trả lại sự khác biệt (tính theo ngày) giữa hai ngày, hãy làm như sau:

function GetDateDiff(startDate, endDate)
{
    return endDate.getDate() - startDate.getDate();
}

Cuối cùng, hãy sửa đổi hàm đầu tiên để nó có thể lấy giá trị được trả về bởi hàm thứ 2 làm tham số:

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}

31
GetDateDiff()sẽ phá vỡ rào cản tháng. Ví dụ: 2011/04/26 và 2011/05/01 sẽ trả về -25, nhưng thời gian bù phải là 5 ngày.
nfm

var ds = new Ngày (2014, 0, 31, 0, 0, 0, 0); var de = new Ngày (2014, 2, 31, 0, 0, 0, 0); GetDateDiff (ds, de) trả về 0
Noor

3

Cảm ơn @ Vincent Robert , tôi đã kết thúc bằng cách sử dụng ví dụ cơ bản của bạn, mặc dù đó là thực tế newBegin + oldEnd - oldBegin. Đây là giải pháp cuối cùng được đơn giản hóa:

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

1
Đó là điểm tốt để giải thích tại sao bạn lại đôi khi sử dụng getTimevà đôi khi không
Dan

2

Tùy thuộc vào nhu cầu của bạn, hàm này sẽ tính toán chênh lệch giữa 2 ngày và trả về kết quả theo ngày thập phân.

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

1
Đặt nó trong một Math.abs()cuộc gọi, và bạn sẽ luôn nhận được một số thập phân dương.
Koen.

1
Đề nghị hay đấy Koen. Điều đó cung cấp cho mọi người 2 lựa chọn: chỉ khác ngày thực sự như bạn đề xuất hoặc một ngày có dấu hiệu cho biết sự khác biệt là trong quá khứ hay tương lai. :)
sparkyspider

Xin lưu ý rằng trong JavaScript, bạn cũng có thể thêm / trừ một số theo mili giây date.getTime()để lấy thời gian trong tương lai / quá khứ. `var nextMinute = new Date (someDate.getTime () + 60 * 1000);
Dan

Đây là một lỗi đánh máy? "giữa 2 ngày". Có lẽ là giữa 2 cuộc hẹn hò.
tomazahlin

2

Nếu sử dụng moment.js, có một giải pháp đơn giản hơn, sẽ cung cấp cho bạn sự khác biệt về số ngày trong một dòng mã.

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

Chi tiết bổ sung có thể được tìm thấy trong trang moment.js

Chúc mừng, Miguel


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

1

mã mở rộng modificitaion thay thế ..

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

Vui lòng làm rõ thêm cho câu trả lời của bạn và sử dụng tiếng Anh tốt hơn.
Vụ kiện của Fund Monica

Giải pháp này sai vì bạn sử dụng 365 ngày, bỏ qua năm nhuận.
Sergey Goliney

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

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

0

mã này điền vào thời gian của các năm học khi bạn nhập ngày bắt đầu và ngày kết thúc (ngày đủ điều kiện được tích lũy) của nghiên cứu và kiểm tra xem thời lượng dưới một năm nếu có, thông báo có lưu ý đến ba yếu tố đầu vào đầu tiên txtFromQualifDatevà thứ hai txtQualifDatevà thứ batxtStudyYears

nó sẽ hiển thị kết quả của số năm với phân số

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

1
Đừng bao giờ phân tích cú pháp chuỗi ngày để tìm năm vì sự xuất hiện của chuỗi (đặc biệt là dấu phân cách) khác nhau giữa các trình duyệt. Sử dụng getFullYearđược thiết kế cho điều đó. ------- Xem thư viện datejs trên googlecode có thể hỗ trợ hầu hết các trường hợp góc
Dan

cảm ơn đã tư vấn @Dan nhưng nó hoạt động và thử nghiệm cho tôi trên dự án chính phủ thực (các trình duyệt khác nhau) có phải là lập trình yếu thực hành không? :)
shareef

0

Nếu bạn sử dụng đối tượng Ngày và sau đó sử dụng getTime() hàm cho cả hai ngày, nó sẽ cung cấp cho bạn thời gian tương ứng của chúng kể từ ngày 1 tháng 1 năm 1970 trong một giá trị số. Sau đó, bạn có thể nhận được sự khác biệt giữa những con số này.

Nếu điều đó không giúp được bạn, hãy xem tài liệu đầy đủ: http://www.w3schools.com/jsref/jsref_obj_date.asp


Ồ, vâng, không để ý, các câu trả lời bên dưới câu trả lời này có tuổi đời nhiều nhất là nửa năm.
Koen.

0

Đoạn mã dưới đây sẽ trả về những ngày còn lại từ hôm nay đến ngày tương lai.

Phụ thuộc: jQuery và 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');

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

0

ĐÂY LÀ NHỮNG GÌ TÔI ĐÃ TRÊN HỆ THỐNG CỦA TÔI.

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.