138

Tôi muốn tính chênh lệch ngày theo ngày, giờ, phút, giây, mili giây, nano giây, làm thế nào tôi có thể làm điều đó? Xin đề nghị.

|
177

Giả sử bạn có hai Dateđối tượng , bạn chỉ cần trừ chúng để có sự khác biệt tính bằng mili giây:

var difference = date2 - date1;

Từ đó, bạn có thể sử dụng số học đơn giản để rút ra các giá trị khác.

|
  • 1

    Đây là câu trả lời đúng. Ví dụ: để có sự khác biệt về số ngày làm Math.floor((date2 - date1) / (1000*60*60*24))- đối với sự khác biệt trong bất kỳ đơn vị nào khác, hãy điều chỉnh mẫu số (giá trị cơ bản được tính bằng ms).

    – Dương Hồng Châu 19:54:38 22/10/2013
  • 1

    Không có số học "đơn giản" để chuyển đổi mili giây thành năm. Bạn phải biết năm bissextile, múi giờ và một số ngày có 23 hoặc 25 giờ. Một số năm có 365,25 ngày, vì vậy không có số học đơn giản ở đây (vẫn đang tìm kiếm một giải pháp chính xác).

    – Trang Bong 12:50:03 20/05/2014
  • 1

    @Alexandre: Câu hỏi không bao giờ được hỏi trong nhiều năm. Thật vậy, tính toán chênh lệch năm là không cần thiết. Tuy nhiên, trong nhiều ngày, điều đó là chính xác, giả sử ngày nằm trong cùng múi giờ (một giả định không hợp lý). Theo như tôi biết, một ngày được định nghĩa là 24 giờ và bất kỳ "biến thể" nào trong đó do Giờ tiết kiệm ánh sáng ban ngày thực sự là một sự thay đổi của các múi giờ. Nếu bạn chưa phân biệt được các múi giờ, cố gắng tìm ra sự khác biệt về thời gian sẽ khiến bạn rơi vào thế giới bị tổn thương, nhất là vì việc chuyển đổi DST 'lặp lại' thời gian. Ở trong một múi giờ, mặc dù, và tất cả đều hoạt động.

    – Đặng Hàm Thơ 05:40:52 21/05/2014
  • 1

    @ trisweb, thậm chí một cái gì đó đơn giản như nhận được sự khác biệt trong ngày còn phức tạp hơn bình luận của bạn. Có bao nhiêu ngày từ 10 giờ tối thứ ba đến 9 giờ sáng thứ tư? Thuật toán của bạn nói 0. Người khác có thể nghĩ 1.

    – Bùi Mỹ Hoàn 01:53:44 19/10/2015
  • 1

    Những người theo thuyết tương đối @RobG thậm chí có thể nghĩ nhiều hơn 1 hoặc ít hơn 0. Tất cả phụ thuộc vào người quan sát.

    – Tạ Mai Quyên 21:59:58 25/06/2018
66
var DateDiff = {

    inDays: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000));
    },

    inWeeks: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000*7));
    },

    inMonths: function(d1, d2) {
        var d1Y = d1.getFullYear();
        var d2Y = d2.getFullYear();
        var d1M = d1.getMonth();
        var d2M = d2.getMonth();

        return (d2M+12*d2Y)-(d1M+12*d1Y);
    },

    inYears: function(d1, d2) {
        return d2.getFullYear()-d1.getFullYear();
    }
}

var dString = "May, 20, 1984";

var d1 = new Date(dString);
var d2 = new Date();

document.write("<br />Number of <b>days</b> since "+dString+": "+DateDiff.inDays(d1, d2));
document.write("<br />Number of <b>weeks</b> since "+dString+": "+DateDiff.inWeeks(d1, d2));
document.write("<br />Number of <b>months</b> since "+dString+": "+DateDiff.inMonths(d1, d2));
document.write("<br />Number of <b>years</b> since "+dString+": "+DateDiff.inYears(d1, d2));

Mẫu mã lấy từ đây .

|
26

Một giải pháp khác là chuyển đổi sự khác biệt sang một đối tượng Ngày mới và lấy năm đó (khác với năm 1970), tháng, ngày, v.v.

var date1 = new Date(2010, 6, 17);
var date2 = new Date(2013, 12, 18);
var diff = new Date(date2.getTime() - date1.getTime());
// diff is: Thu Jul 05 1973 04:00:00 GMT+0300 (EEST)

console.log(diff.getUTCFullYear() - 1970); // Gives difference as year
// 3

console.log(diff.getUTCMonth()); // Gives month count of difference
// 6

console.log(diff.getUTCDate() - 1); // Gives day count of difference
// 4

Vì vậy, sự khác biệt giống như "3 năm 6 tháng và 4 ngày". Nếu bạn muốn có sự khác biệt trong một phong cách dễ đọc của con người, điều đó có thể giúp bạn.

|
  • 1

    Nó không phải là ý nghĩa! Chúng tôi muốn sự khác biệt WHOLE! Trong examp này, differene trong ngày là 1281, không phải 4!

    – Lý Hữu Bình 06:44:59 11/03/2014
  • 1

    @ chaim.dev "Nếu bạn muốn có sự khác biệt trong phong cách dễ đọc của con người, điều đó có thể giúp bạn."

    – Tạ Minh Khang 08:30:54 12/04/2015
  • 1

    Điều này không đáng tin cậy. Nó không tính đến các độ dài tháng khác nhau, hoặc năm nhuận và các bất thường khác.

    – Lý Thiên Duyên 01:03:05 13/07/2015
  • 1

    Cảm ơn Murat, giải pháp này đã giải quyết vấn đề của tôi. Điều tôi thực sự muốn là Nó phải hoạt động theo cách tương tự như php.

    – Hoàng Trí Đạt 06:44:20 07/11/2017
21

Biểu hiện như "sự khác biệt trong ngày" không bao giờ đơn giản như chúng có vẻ. Nếu bạn có những ngày sau:

d1: 2011-10-15 23:59:00
d1: 2011-10-16 00:01:00

chênh lệch về thời gian là 2 phút, "chênh lệch theo ngày" là 1 hay 0? Các vấn đề tương tự phát sinh đối với bất kỳ biểu hiện nào của sự khác biệt về tháng, năm hoặc bất cứ điều gì kể từ năm, tháng và ngày có độ dài khác nhau và thời gian khác nhau (ví dụ: ngày bắt đầu tiết kiệm ánh sáng ban ngày ngắn hơn bình thường 1 giờ và ngắn hơn hai giờ so với ngày nó kết thúc).

Đây là một hàm cho sự khác biệt về số ngày mà bỏ qua thời gian, tức là cho những ngày trên, nó trả về 1.

/*
   Get the number of days between two dates - not inclusive.

   "between" does not include the start date, so days
   between Thursday and Friday is one, Thursday to Saturday
   is two, and so on. Between Friday and the following Friday is 7.

   e.g. getDaysBetweenDates( 22-Jul-2011, 29-jul-2011) => 7.

   If want inclusive dates (e.g. leave from 1/1/2011 to 30/1/2011),
   use date prior to start date (i.e. 31/12/2010 to 30/1/2011).

   Only calculates whole days.

   Assumes d0 <= d1
*/
function getDaysBetweenDates(d0, d1) {

  var msPerDay = 8.64e7;

  // Copy dates so don't mess them up
  var x0 = new Date(d0);
  var x1 = new Date(d1);

  // Set to noon - avoid DST errors
  x0.setHours(12,0,0);
  x1.setHours(12,0,0);

  // Round to remove daylight saving errors
  return Math.round( (x1 - x0) / msPerDay );
}

Điều này có thể ngắn gọn hơn:

/*  Return number of days between d0 and d1.
**  Returns positive if d0 < d1, otherwise negative.
**
**  e.g. between 2000-02-28 and 2001-02-28 there are 366 days
**       between 2015-12-28 and 2015-12-29 there is 1 day
**       between 2015-12-28 23:59:59 and 2015-12-29 00:00:01 there is 1 day
**       between 2015-12-28 00:00:01 and 2015-12-28 23:59:59 there are 0 days
**        
**  @param {Date} d0  - start date
**  @param {Date} d1  - end date
**  @returns {number} - whole number of days between d0 and d1
**
*/
function daysDifference(d0, d1) {
  var diff = new Date(+d1).setHours(12) - new Date(+d0).setHours(12);
  return Math.round(diff/8.64e7);
}

// Simple formatter
function formatDate(date){
  return [date.getFullYear(),('0'+(date.getMonth()+1)).slice(-2),('0'+date.getDate()).slice(-2)].join('-');
}

// Examples
[[new Date(2000,1,28), new Date(2001,1,28)],  // Leap year
 [new Date(2001,1,28), new Date(2002,1,28)],  // Not leap year
 [new Date(2017,0,1),  new Date(2017,1,1)] 
].forEach(function(dates) {
  document.write('From ' + formatDate(dates[0]) + ' to ' + formatDate(dates[1]) +
                 ' is ' + daysDifference(dates[0],dates[1]) + ' days<br>');
});

|
  • 1

    công việc tuyệt vời, thx

    – Dương Thu Phương 03:29:09 28/04/2013
  • 1

    Dường như không hoạt động trong firefox hoặc IE. Chỉ hoạt động trong chrome

    – Trịnh Ðông Vy 02:59:03 17/05/2013
  • 1

    @ rudeovskizebear, được thử nghiệm trên IE, Firefox và Safari, hoạt động tốt. Nó sử dụng ECMAScript cơ bản mà tôi mong đợi hoạt động trong bất kỳ trình duyệt nào, điều gì không phù hợp với bạn?

    – Tạ Mai Linh 05:27:09 17/05/2013
  • 1

    Tôi đã đặt nó trên một trang thử nghiệm và nó hoạt động tốt trong chrome, nhưng tôi đã tiếp tục lấy lại null trong IE9 và FF mới nhất

    – Hồ Thiên Mạnh 05:31:36 17/05/2013
  • 1

    @ IgorKudryashov, xin lỗi, tôi chỉ không nhận được nó. Năm 2000 là một năm nhuận, vì vậy ngày 28 tháng 2 năm 2000 đến ngày 28 tháng 2 năm 2001 là 365 ngày. Trong một năm không nhảy vọt, đó là 365 ngày. Tôi đã thêm một số ví dụ.

    – Trịnh Hải Vy 23:21:45 05/07/2017
18
<html lang="en">
<head>
<script>
function getDateDiff(time1, time2) {
  var str1= time1.split('/');
  var str2= time2.split('/');

  //                yyyy   , mm       , dd
  var t1 = new Date(str1[2], str1[0]-1, str1[1]);
  var t2 = new Date(str2[2], str2[0]-1, str2[1]);

  var diffMS = t1 - t2;    
  console.log(diffMS + ' ms');

  var diffS = diffMS / 1000;    
  console.log(diffS + ' ');

  var diffM = diffS / 60;
  console.log(diffM + ' minutes');

  var diffH = diffM / 60;
  console.log(diffH + ' hours');

  var diffD = diffH / 24;
  console.log(diffD + ' days');
  alert(diffD);
}

//alert(getDateDiff('10/18/2013','10/14/2013'));
</script>
</head>
<body>
  <input type="button" 
       onclick="getDateDiff('10/18/2013','10/14/2013')" 
       value="clickHere()" />

</body>
</html>
|
9

sử dụng Moment.js cho tất cả tính toán thời gian liên quan đến JavaScript của bạn

Trả lời câu hỏi của bạn là:

var a = moment([2007, 0, 29]);   
var b = moment([2007, 0, 28]);    
a.diff(b) // 86400000  

Chi tiết đầy đủ có thể được tìm thấy ở đây

|
  • 1

    Và nắm lấy hơn 400 Kb cho một sự khác biệt ngày chỉ.

    – Đỗ Ðinh Lộc 04:59:22 19/12/2018
  • 1

    @RomeoMihalcea Khoảnh khắc được thu nhỏ hiện tại 2.22.2 với một ngôn ngữ là 53 KB, được nén 17 KB. Tôi hiểu mối quan tâm của bạn mặc dù. Đó là một thư viện khổng lồ để sử dụng cho một chức năng đơn giản, nhưng nó quan tâm đến rất nhiều điều kỳ quặc liên quan đến ngày / giờ mà nó thường có giá trị.

    – Hồ Minh Quang 08:41:58 23/01/2019
8
function DateDiff(date1, date2) {
    date1.setHours(0);
    date1.setMinutes(0, 0, 0);
    date2.setHours(0);
    date2.setMinutes(0, 0, 0);
    var datediff = Math.abs(date1.getTime() - date2.getTime()); // difference 
    return parseInt(datediff / (24 * 60 * 60 * 1000), 10); //Convert values days and return value      
}
|
  • 1

    Cảm ơn các giải pháp :)

    – Đỗ Ðinh Lộc 09:57:31 18/07/2013
  • 1

    Hầu hết các giải pháp mà tôi thấy hoặc không hoạt động hoặc quá dài. Giải pháp của bạn là đơn giản nhất cho đến nay và hoạt động chính xác như dự định! Chúc mừng :)

    – Hồ Minh Quang 04:19:34 09/03/2015
  • 1

    Điều gì xảy ra nếu tôi muốn biết sự khác biệt với chính xác hơn một giờ? trong câu hỏi đăng có giờ và giây, điều gì cho tất cả các số không này?

    – Hoàng Khả Tú 11:29:21 04/09/2018
7

Với khoảnh khắc thật đơn giản:

moment("2016-04-08").fromNow();
|
5
var d1=new Date(2011,0,1); // jan,1 2011
var d2=new Date(); // now

var diff=d2-d1,sign=diff<0?-1:1,milliseconds,seconds,minutes,hours,days;
diff/=sign; // or diff=Math.abs(diff);
diff=(diff-(milliseconds=diff%1000))/1000;
diff=(diff-(seconds=diff%60))/60;
diff=(diff-(minutes=diff%60))/60;
days=(diff-(hours=diff%24))/24;

console.info(sign===1?"Elapsed: ":"Remains: ",
             days+" days, ",
             hours+" hours, ",
             minutes+" minutes, ",
             seconds+" seconds, ",
             milliseconds+" milliseconds.");
|
4

Xin lỗi nhưng tính toán mili giây không đáng tin cậy Cảm ơn tất cả các phản hồi, nhưng một số chức năng tôi đã thử bị lỗi vào ngày 1. Một ngày gần ngày hôm nay 2. Một ngày trong năm 1970 hoặc 3. Một ngày trong năm nhuận.

Cách tiếp cận phù hợp nhất với tôi và bao gồm tất cả các kịch bản, ví dụ như năm nhuận, gần ngày vào năm 1970, feb 29, v.v.

var someday = new Date("8/1/1985");
var today = new Date();
var years = today.getFullYear() - someday.getFullYear();

// Reset someday to the current year.
someday.setFullYear(today.getFullYear());

// Depending on when that day falls for this year, subtract 1.
if (today < someday)
{
    years--;
}
document.write("Its been " + years + " full years.");
|
3
function DateDiff(b, e)
{
    let
        endYear = e.getFullYear(),
        endMonth = e.getMonth(),
        years = endYear - b.getFullYear(),
        months = endMonth - b.getMonth(),
        days = e.getDate() - b.getDate();
    if (months < 0)
    {
        years--;
        months += 12;
    }
    if (days < 0)
    {
        months--;
        days += new Date(endYear, endMonth, 0).getDate();
    }
    return [years, months, days];
}

[years, months, days] = DateDiff(
    new Date("October 21, 1980"),
    new Date("July 11, 2017")); // 36 8 20
|
3

Nếu bạn đang sử dụng Moment.js thì việc tìm ngày khác biệt là khá đơn giản.

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")
|
2

Đây là cách bạn có thể thực hiện sự khác biệt giữa các ngày mà không cần khung.

function getDateDiff(dateOne, dateTwo) {
        if(dateOne.charAt(2)=='-' & dateTwo.charAt(2)=='-'){
            dateOne = new Date(formatDate(dateOne));
            dateTwo = new Date(formatDate(dateTwo));
        }
        else{
            dateOne = new Date(dateOne);
            dateTwo = new Date(dateTwo);            
        }
        let timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime());
        let diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
        let diffMonths = Math.ceil(diffDays/31);
        let diffYears = Math.ceil(diffMonths/12);

        let message = "Difference in Days: " + diffDays + " " +
                      "Difference in Months: " + diffMonths+ " " + 
                      "Difference in Years: " + diffYears;
        return message;
     }

    function formatDate(date) {
         return date.split('-').reverse().join('-');
    }

    console.log(getDateDiff("23-04-2017", "23-04-2018"));
|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.