Berapa Banyak Detik Antara Dua Tanggal?


180

Jadi saya punya dua kencan YYYY-MM-DDdanZZZZ-NN-EE

Bagaimana saya bisa mengetahui ada berapa detik di antara mereka?


173
Saya mencoba untuk meninggalkan setidaknya setengah jam antara kencan untuk menjaga dari tertangkap.
Don Branson

yyyy-MM-ddjelas (tahun, bulan, hari -catat bahwa mereka tidak semuanya ditulis dalam huruf besar), tetapi ZZZZ-NN-EE tidak demikian. Saya menafsirkannya sebagai (zona waktu, ???, hari-dalam-minggu). Apakah ini minggu ke tahun? Jika demikian, itu akan terjadi ww. Tapi tetap saja kita membutuhkan tahun juga untuk menghitung perbedaannya. Bisakah Anda memberikan beberapa nilai sampel yang sebenarnya?
BalusC

7
@ BalusC: Saya percaya dia baru saja pergi ke surat berikutnya untuk menunjukkan kencan kedua (Y -> Z, M -> N, dan D -> E). Menggunakan nama variabel seperti startDate dan endDate mungkin akan lebih baik.
Austin Salonen

Ah, begitu. Ini memang bisa ditanyakan jauh lebih jelas.
BalusC

Jawaban:


242

Saya menggunakan YYYY & ZZZZ untuk berarti nilai integer yang berarti tahun, MM & NN berarti nilai integer yang berarti bulan dalam setahun dan DD & EE sebagai nilai integer yang berarti hari dalam sebulan.

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

Sumber praktis untuk referensi di masa mendatang adalah situs MDN

Atau, jika tanggal Anda datang dalam format javascript dapat diuraikan

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

dan kemudian Anda dapat menggunakan nilai itu sebagai perbedaan dalam milidetik (berbeda dalam kedua contoh saya memiliki arti yang sama)


1
Hanya pola yang digunakan dalam contoh ini yang tidak benar. Tahun 4 digit dicatat dengan huruf kecil yyyy, bulan 2 digit dengan huruf besar MMdan hari 2 digit dengan huruf kecil dd.
BalusC

1
Martin, saya mendapat kesan yang tidak menggunakan pola tanggal di sini. MM DD, YYYY dan NN EE, ZZZZ sebenarnya adalah "nilai contoh" yang diminta Steven. Jadi dengan kata lain, dia tidak melakukan apapun untuk memformat.
Wagner Silveira

Saya telah memperbarui contoh kedua, yang saya kira semua orang bingung. Saya juga menambahkan sedikit klarifikasi tentang bagaimana tepatnya saya menafsirkan nilai-nilai yang diberikan dalam contohnya.
Martin

Variabel kedua Anda perlu dipanggil t2.
Kees C. Bakker

Dalam kebanyakan kasus, Anda mungkin akan melakukan t2 - t1, bukan t1 - t2
UpTheCreek

83

Cukup kurangi:

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 - maka sesuatu yang lucu sedang terjadi! Periksa nilai adan bdan pastikan bahwa itu adalah Tanggal.
Seth

@Seth Anda benar jadi saya menghapus komentar saya .. salah satu "kencan" saya sebenarnya adalah string. Ini bekerja dengan sempurna.
user3344977

14

Jika salah satu atau kedua kencan Anda di masa depan, maka saya khawatir Anda SOL jika Anda ingin akurasi kedua. Waktu UTC memiliki lompatan detik yang tidak diketahui sampai sekitar 6 bulan sebelum itu terjadi, sehingga tanggal yang lebih jauh dari itu dapat tidak akurat oleh beberapa detik (dan dalam praktiknya, karena orang tidak memperbarui mesin mereka sesering itu, Anda mungkin menemukan bahwa waktu di masa depan mati oleh beberapa detik).

Ini memberikan penjelasan yang bagus tentang teori merancang perpustakaan tanggal / waktu dan mengapa demikian: http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/details.html#date_time.tradeoffs


7
+1 untuk menyebutkan edisi kedua leap! Ini sangat menyebalkan ketika ini salah penanganan, bahkan oleh orang-orang yang seharusnya tahu lebih baik (komite POSIX, saya melihat Anda ...)
Jim Lewis

1
Patut disebutkan bahwa standar ECMA secara eksplisit mengabaikan detik kabisat (yaitu: bahkan melewati detik kabisat): Dalam nilai waktu detik kabisat diabaikan. Diasumsikan ada 86.400.000 milidetik per hari .
Sylvain Leroux

11

Anda dapat melakukannya dengan sederhana.

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

Jalan mudah:

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

Dalam bash:

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

Itu memang membutuhkan memiliki tanggal bc dan gnu diinstal.


1
Bagaimana ini relevan?
Dropout

-10

.Net menyediakan kelas TimeSpan untuk melakukan perhitungan matematika untuk Anda.

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, Anda mungkin ingin menghapus jawaban ini sehingga Anda tidak kehilangan poin. Mereka meminta kode sumber JavaScript, daripada kode sumber Visual Basic.
MacGyver
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.