简体   繁体   English

在 javascript 中计算天数时的精度问题

[英]Precision problem when calculate number of days in javascript

I need calculate number of days between two dates on javascript - it seems easy task, but i have wrong result only on javascript.我需要计算 javascript 上两个日期之间的天数 - 这似乎很容易,但我只在 javascript 上得到错误的结果。

I start to make test in Excel and there formula:我开始在 Excel 中进行测试,并有公式:

=ДНИ(ДАТА($F$1;$E$1;$C$1);ДАТА(1930;2;4))

In English i think it:在英语中,我认为:

=DAYS(DATE($F$1;$E$1;$C$1);DATE(1930;2;4))

Here i prepare google sheet to demonstrate在这里我准备谷歌表来演示

https://docs.google.com/spreadsheets/d/13W3ntecXDUW6Z4gJliG0nbRfcWGgMFeHpnGtJdppCbw/edit?usp=sharing https://docs.google.com/spreadsheets/d/13W3ntecXDUW6Z4gJliG0nbRfcWGgMFeHpnGtJdppCbw/edit?usp=sharing

So result is 33346 if we check date 2021/05/23.所以如果我们检查日期 2021/05/23,结果是33346 This is correct answer i need.这是我需要的正确答案。 Now i try do similar task in javascript:现在我尝试在 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)));    
}

And result is 33349结果是33349

So it 33346 vs 33349 on javascript, and if i try other dates it still give me +-1-2 days to correct answer.所以它在 javascript 上是3334633349 ,如果我尝试其他日期,它仍然会给我 +-1-2 天的时间来正确答案。

So i got to PHP and try to do similar task:所以我到了 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));

And result is 33346 (current date is 2021/05/23)结果是33346 (当前日期是 2021/05/23)

So it javascript fault in some ways it miscalculate dates.所以它 javascript 在某些方面错误计算日期。 I try different thing - using UNIX time and etc, but still can get correct result from javascript at all.我尝试不同的东西 - 使用 UNIX 时间等,但仍然可以从 javascript 得到正确的结果。

Is there correct way to precise calculate dates, and not moment.js because it obsolete!有没有正确的方法来精确计算日期,而不是 moment.js,因为它已经过时了!

Update 1 :更新 1

So problem was in month, In JavaScript in new Date() you need use (month-1), months go from 0 to 11所以问题出在月份,在新日期()的 JavaScript 中,您需要使用(第 1 个月),月份 go 从 0 到 11

Working code:工作代码:

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

So problem was in month, In JavaScript in new Date() you need use (month-1), months go from 0 to 11所以问题出在月份,在新日期()的 JavaScript 中,您需要使用(第 1 个月),月份 go 从 0 到 11

Working code:工作代码:

exports.getDaysPassed = function(day, month, year) { export.getDaysPassed = 函数(日、月、年){

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

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM