Bao nhiêu giây giữa hai ngày?


180

Vì vậy, tôi có hai ngày YYYY-MM-DDZZZZ-NN-EE

Làm thế nào tôi có thể tìm ra có bao nhiêu giây giữa chúng?


173
Tôi cố gắng để lại ít nhất nửa giờ giữa các ngày để tránh bị bắt.
Don Branson

yyyy-MM-ddlà rõ ràng (năm, tháng, ngày - lưu ý rằng chúng không phải là tất cả các dòng trên), nhưng ZZZZ-NN-EE không như vậy. Tôi giải thích nó là (múi giờ, ???, ngày trong tuần). Có phải là trong tuần? Nếu vậy, đó sẽ là ww. Nhưng sau đó chúng ta vẫn cần năm để tính chênh lệch. Bạn có thể vui lòng cho một số giá trị mẫu thực tế?
BalusC

7
@BalusC: Tôi tin rằng anh ấy chỉ đi đến các chữ cái tiếp theo để biểu thị một ngày thứ hai (Y -> Z, M -> N và D -> E). Sử dụng các tên biến như startDate và endDate có lẽ sẽ tốt hơn.
Austin Salonen

Ah tôi thấy. Điều này thực sự có thể đã được hỏi rõ ràng hơn nhiều.
BalusC

Câu trả lời:


242

Tôi đang dùng YYYY & ZZZZ có nghĩa là các giá trị nguyên có nghĩa là năm, MM & NN có nghĩa là các giá trị nguyên có nghĩa là tháng của năm và DD & EE là giá trị nguyên có nghĩa là ngày của tháng.

var t1 = new Date(YYYY, MM, DD, 0, 0, 0, 0);
var t2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0);
var dif = t1.getTime() - t2.getTime();

var Seconds_from_T1_to_T2 = dif / 1000;
var Seconds_Between_Dates = Math.abs(Seconds_from_T1_to_T2);

Một nguồn hữu ích để tham khảo trong tương lai là trang MDN

Ngoài ra, nếu ngày của bạn có định dạng javascript có thể phân tích cú pháp

var dif = Date.parse(MM + " " + DD + ", " + YYYY) - Date.parse(NN + " " + EE + ", " + ZZZZ);

và sau đó bạn có thể sử dụng giá trị đó làm chênh lệch tính bằng mili giây (khác nhau trong cả hai ví dụ của tôi đều có cùng ý nghĩa)


1
Chỉ các mẫu được sử dụng trong ví dụ không đúng. Năm 4 chữ số được ghi chú bằng chữ thường yyyy, tháng 2 chữ số theo chữ hoa MMvà ngày 2 chữ số bằng chữ thường dd.
BalusC

1
Martin, tôi có ấn tượng rằng không sử dụng bất kỳ mẫu ngày nào ở đây. MM DD, YYYY và NN EE, ZZZZ thực sự là những "giá trị mẫu" mà Steven yêu cầu. Vì vậy, nói cách khác, anh ta không làm bất kỳ loại định dạng nào.
Wagner Silveira

Tôi đã cập nhật ví dụ thứ hai, đó là điều mà tôi đoán mọi người đang nhầm lẫn. Tôi cũng đã thêm một chút làm rõ về cách chính xác cách tôi diễn giải các giá trị được đưa ra trong ví dụ của anh ấy.
Martin

Biến thứ hai của bạn cần được gọi t2.
Kees C. Bakker

Trong hầu hết các trường hợp, bạn có thể sẽ thực hiện t2 - t1, không phải t1 - t2
UpTheCux

83

Chỉ cần trừ

var a = new Date();
alert("Wait a few seconds, then click OK");

var b = new Date();
var difference = (b - a) / 1000;

alert("You waited: " + difference + " seconds");

@ user3344977 - sau đó một cái gì đó buồn cười đang diễn ra! Kiểm tra các giá trị abvà đảm bảo rằng chúng là Ngày.
Seth

@ Vì bạn đúng nên tôi đã xóa nhận xét của mình .. một trong những "ngày" của tôi thực sự là một chuỗi. Điều này hoạt động hoàn hảo.
dùng344977

14

Nếu một hoặc cả hai ngày của bạn là trong tương lai, thì tôi sợ bạn là SOL nếu bạn muốn độ chính xác đến từng giây. Thời gian UTC có những giây không được biết đến cho đến khoảng 6 tháng trước khi chúng xảy ra, do đó, bất kỳ ngày nào xa hơn có thể không chính xác bởi một số giây (và trong thực tế, vì mọi người không cập nhật máy của họ thường xuyên, bạn có thể thấy rằng bất cứ lúc nào trong tương lai đều bị tắt bởi một số giây).

Điều này đưa ra một lời giải thích tốt về lý thuyết thiết kế thư viện ngày / giờ và tại sao lại như vậy: http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/details.html#date_time.tradeoffs


7
+1 để đề cập đến vấn đề thứ hai nhảy vọt! Thật là bực bội khi điều này bị xử lý sai, ngay cả bởi những người nên biết rõ hơn (ủy ban POSIX, tôi đang nhìn bạn ...)
Jim Lewis

1
Đáng nói rằng tiêu chuẩn ECMA dứt khoát bỏ qua giây nhuận (ví dụ: ngay cả trong quá khứ giây nhuận): Trong thời gian giá trị giây nhuận được bỏ qua. Người ta cho rằng có chính xác 86.400.000 mili giây mỗi ngày .
Sylvain Leroux

11

Bạn có thể làm điều đó một cách đơn giản.

var secondBetweenTwoDate = Math.abs((new Date().getTime() - oldDate.getTime()) / 1000);


4
var a = new Date("2010 jan 10"),
    b = new Date("2010 jan 9");

alert(
    a + "\n" + 
    b + "\n" +
    "Difference: " + ((+a - +b) / 1000)
);

0

Cách dễ dàng:

function diff_hours(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60 * 60);
  return Math.abs(Math.round(diff));

 }


function diff_minutes(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  diff /= (60);
  return Math.abs(Math.round(diff));

 }

function diff_seconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime()) / 1000;
  return Math.abs(Math.round(diff));

 }

function diff_miliseconds(dt2, dt1) 
 {

  var diff =(dt2.getTime() - dt1.getTime());
  return Math.abs(Math.round(diff));

 }


dt1 = new Date(2014,10,2);
dt2 = new Date(2014,10,3);
console.log(diff_hours(dt1, dt2));


dt1 = new Date("October 13, 2014 08:11:00");
dt2 = new Date("October 14, 2014 11:13:00");
console.log(diff_hours(dt1, dt2));

console.log(diff_minutes(dt1, dt2));

console.log(diff_seconds(dt1, dt2));

console.log(diff_miliseconds(dt1, dt2));

-3

Trong bash:

bc <<< "$(date --date='1 week ago' +%s) - \
    $(date --date='Sun,  29 Feb 2004 16:21:42 -0800' +%s)"

Nó không yêu cầu cài đặt ngày bc và gnu.


1
Làm thế nào điều này có liên quan?
Bỏ học

-10

.Net cung cấp lớp TimeSpan để làm toán cho bạn.

var time1 = new Date(YYYY, MM, DD, 0, 0, 0, 0)
var time2 = new Date(ZZZZ, NN, EE, 0, 0, 0, 0)

Dim ts As TimeSpan = time2.Subtract(time1)

ts.TotalSeconds

@Jeff, bạn có thể muốn xóa câu trả lời này để không bị mất điểm. Họ yêu cầu mã nguồn JavaScript, thay vì mã nguồn Visual Basic.
MacGyver
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.