<p>例如,输入框中给出两个日期:</p>
<pre class="brush:php;toolbar:false;"><input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
<script>
alert(datediff("day", first, second)); // what goes here?
</script></pre>
<p>如何在 JavaScript 中获取两个日期之间的天数?</p>
截至撰写本文时,只有其他答案之一可以正确处理 DST(夏令时)转换。以下是位于加利福尼亚州的系统上的结果:
虽然
Math.round返回正确的结果,但我认为它有点笨拙。相反,通过显式考虑 DST 开始或结束时 UTC 偏移量的变化,我们可以使用精确的算术: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()));说明
JavaScript 日期计算很棘手,因为
Date对象在内部存储 UTC 时间,而不是本地时间。例如,3/10/2013 12:00 AM 太平洋标准时间 (UTC-08:00) 存储为 3/10/2013 8:00 AM UTC,3/11/2013 12:00 AM 太平洋夏令时间 ( UTC-07:00) 存储为 3/11/2013 7:00 AM UTC。这一天,当地时间午夜到午夜仅比 UTC 23 小时!虽然当地时间的一天可以多于或少于 24 小时,但 UTC 的一天始终恰好是 24 小时。1 上面显示的
daysBetween方法利用了这一点通过首先调用treatAsUTC将两个本地时间调整为午夜 UTC,然后再进行减法和除法来了解这一事实。1。 JavaScript 忽略闰秒。
这里是
datediff的快速而肮脏的实现,作为解决问题中提出的问题的概念证明。它依赖于这样一个事实:您可以通过减去两个日期来获取它们之间经过的毫秒数,这会将它们强制转换为其原始数值(自 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)));