Rumah > Soal Jawab > teks badan
P粉9680081752023-08-24 14:38:40
Setakat artikel ini ditulis, hanya satu daripada jawapan lain yang mengendalikan penukaran DST (Masa Penjimatan Siang) dengan betul. Berikut adalah keputusan pada sistem yang terletak di California:
1/1/2013- 3/10/2013- 11/3/2013- User Formula 2/1/2013 3/11/2013 11/4/2013 Result --------- --------------------------- -------- --------- --------- --------- Miles (d2 - d1) / N 31 0.9583333 1.0416666 Incorrect some Math.floor((d2 - d1) / N) 31 0 1 Incorrect fuentesjr Math.round((d2 - d1) / N) 31 1 1 Correct toloco Math.ceiling((d2 - d1) / N) 31 1 2 Incorrect N = 86400000
Walaupun Math.round
mengembalikan hasil yang betul, saya rasa ia agak kekok. Sebaliknya, dengan mengambil kira secara jelas perubahan dalam offset UTC apabila DST bermula atau tamat, kita boleh menggunakan aritmetik tepat:
function treatAsUTC(date) { var result = new Date(date); result.setMinutes(result.getMinutes() - result.getTimezoneOffset()); return result; } function daysBetween(startDate, endDate) { var millisecondsPerDay = 24 * 60 * 60 * 1000; return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay; } alert(daysBetween($('#first').val(), $('#second').val()));
Pengiraan tarikh JavaScript adalah rumit kerana Date
objek menyimpan masa UTC secara dalaman, bukan waktu tempatan. Contohnya, 3/10/2013 12:00 PG Waktu Standard Pasifik (UTC-08:00) disimpan sebagai 3/10/2013 8:00 PG UTC dan 3/11/2013 12:00 PG Waktu Siang Pasifik ( UTC-07:00) disimpan sebagai 3/11/2013 7:00 AM UTC. Pada hari ini, waktu tempatan dari tengah malam hingga tengah malam hanya 23 jam lebih awal daripada UTC!
Walaupun sehari dalam waktu tempatan boleh menjadi lebih atau kurang daripada 24 jam, sehari dalam UTC sentiasa tepat 24 jam. 1 daysBetween
方法利用了这一点通过首先调用 treatAsUTC
yang ditunjukkan di atas melaraskan dua waktu tempatan kepada UTC tengah malam dan kemudian melakukan penolakan dan pembahagian untuk memahami fakta ini.
1. JavaScript mengabaikan saat lompat.
P粉1868974652023-08-24 12:44:32
Berikut adalah datediff
cepat dan kotorpelaksanaan sebagai bukti konsep untuk menyelesaikan masalah yang dikemukakan dalam soalan. Ia bergantung pada fakta bahawa anda boleh mendapatkan bilangan milisaat yang berlalu antara dua tarikh dengan menolaknya, yang memaksa mereka kepada nilai berangka asalnya (bilangan milisaat sejak awal tahun 1970).
/** * Take the difference between the dates and divide by milliseconds per day. * Round to nearest whole number to deal with DST. */ function datediff(first, second) { return Math.round((second - first) / (1000 * 60 * 60 * 24)); } /** * new Date("dateString") is browser-dependent and discouraged, so we'll write * a simple parse function for U.S. date format (which does no error checking) */ function parseDate(str) { var mdy = str.split('/'); return new Date(mdy[2], mdy[0] - 1, mdy[1]); } alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/> <input id="second" value="1/1/2001"/>