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ị.
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
– Dương Hồng Châu 19:54:38 22/10/2013Math.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). -
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
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 .
-
1
Một giải pháp chính xác hơn: stackoverflow.com/a/152898833531947
– Hoàng Uyên Minh 11:43:15 16/06/2013 -
1
Điều này chỉ trả về chênh lệch ngày trong định dạng đã cho nếu được sử dụng như một bộ đếm duy nhất. Ví dụ: nếu bạn muốn 3 tháng 4 ngày và 5 giờ thì nó sẽ KHÔNG tạo ra những kết quả đó. Nhiều hơn trong dòng 3 tháng 96 ngày và rất nhiều giờ.
– Tạ Ái Nghi 09:02:19 27/10/2017
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
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
-
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
<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>
-
1
-
1
Không giúp tôi. Không thể kéo dài điều này đến tháng hoặc năm theo cùng một cách tiếp cận.
– Trịnh Trang Nhã 15:34:14 18/01/2016
-
1
-
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
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
-
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
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.");
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.");
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
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")
Đâ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ó thể trùng lặp Nhận được sự khác biệt giữa 2 ngày trong javascript?
– Vũ Kiều Tâm 14:57:21 30/08/2013Các giải pháp dưới đây sẽ bị phá vỡ nếu hai ngày có liên quan ở các múi giờ khác nhau. Xem câu hỏi tại để biết giải pháp stackoverflow.com/questions/3224834/ cấp chính xác hơn ?
– Lý Minh Hưng 23:08:34 28/03/2014Bản sao có thể có của Làm cách nào tôi có được số ngày giữa hai ngày trong JavaScript?
– Bùi Bảo Ngọc 10:13:45 04/09/2018