【发布时间】:2021-05-23 10:17:10
【问题描述】:
我需要在 javascript 上计算两个日期之间的天数 - 这似乎很容易,但我只在 javascript 上得到错误的结果。
我开始在 Excel 中进行测试,并有公式:
=ДНИ(ДАТА($F$1;$E$1;$C$1);ДАТА(1930;2;4))
我认为是英文:
=DAYS(DATE($F$1;$E$1;$C$1);DATE(1930;2;4))
这里我准备了google sheet来演示
https://docs.google.com/spreadsheets/d/13W3ntecXDUW6Z4gJliG0nbRfcWGgMFeHpnGtJdppCbw/edit?usp=sharing
如果我们检查日期 2021/05/23,结果是 33346。这是我需要的正确答案。现在我尝试在 javascript 中执行类似的任务:
exports.getDaysPassed = function(day, month, year) {
const date1 = new Date(1930,2,4);
const date2 = new Date(year, month, day);
date1.setHours(12,0,0);
date2.setHours(12,0,0);
return Math.round(Math.abs((date2 - date1) /(1000*60*60*24)));
}
结果是33349
所以 33346 vs 33349 在 javascript 上,如果我尝试其他日期,它仍然会给我 +-1-2 天的时间来正确答案。
所以我开始使用 PHP 并尝试做类似的任务:
<?php
$now = time(); // or your date as well
$your_date = strtotime("1930-02-04");
$datediff = $now - $your_date;
echo round($datediff / (60 * 60 * 24));
结果是33346(当前日期是2021/05/23)
所以它在某些方面错误地计算了日期。我尝试了不同的东西 - 使用 UNIX 时间等,但仍然可以从 javascript 中得到正确的结果。
有没有正确的方法来精确计算日期,而不是 moment.js,因为它已经过时了!
更新 1:
所以问题在一个月内!在 new Date() 中的 JavaScript 中,您需要使用 (month-1),月份从 0 到 11
工作代码:
exports.getDaysPassed = function(day, month, year) {
const date1 = new Date(1930,1,4);
const date2 = new Date(year, month-1, day);
date1.setHours(12,0,0);
date2.setHours(12,0,0);
return Math.round(Math.abs((date2 - date1) /(1000*60*60*24)));
}
【问题讨论】:
-
FWIW,在 Date 构造函数中,月份是从零开始的(2 = March)
-
哇,谢谢,不要记住这件事!
标签: javascript php excel date days