简体   繁体   English

再次关于使用 JavaScript 计算两个日期之间的天数

[英]And again about calculate the number of days between two dates using JavaScript

Seems that solution from How to calculate the number of days between two dates using JavaScript?似乎是如何使用 JavaScript 计算两个日期之间的天数的解决方案 work fine exept for case : 30.4.2016 - 1.5.2016 it calculate 2 days ( in real 1 ) 29.2.2016 - 1.3.2016 it calculate 3 days ( in real 1 )工作正常,情况除外: 30.4.2016 - 1.5.2016 计算 2 天(实际 1 ) 29.2.2016 - 1.3.2016 计算 3 天(实际 1 )

May be someone already found solution for these cases ?可能有人已经为这些情况找到了解决方案?

This function from link
function count_days(){ // Expecting resuls: positive when date1 > date2  ; negative  when date1 < date2  
            var $obj = "dd.mm.YYYY";
            var $obj2 = "dd.mm.YYYY";
            if($obj2.value){
                $start=$obj.value.split(".");
                var date1 = new Date($start[2],$start[1],$start[0]); // Converted date to ("YYYY,mm,dd")
                var $stop=$obj2.value.split(".");
                var date2 = new Date($stop[2],$stop[1],$stop[0]); // Converted date to ("YYYY,mm,dd")
                var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
                var diffDays = (date2.getTime() - date1.getTime())/(oneDay);
                if(diffDays >= 0){
                    return Math.abs(diffDays)+1;
                } else {
                    return diffDays-1;
                }
            }
return false; // No date2 nothing to compare  
}
// Expecting resuls in full days (24h):  
//(5.5.2016 - 5.5.2016) =  1 day (days equal)  
//(29.2.2016 - 1.3.2016) =  1 day  
//(30.4.2016 - 1.5.2016) =  1 day  
//(4.5.2016 - 5.5.2016) =  2 days  
//(29.2.2016 - null) = False   
//(1.3.2016 - 29.2.2016) = -1 day  
//(1.5.2016 - 30.4.2016) = -1 day  
//(5.5.2016 - 4.5.2016)  = -2 day  

Note that new Date() 's month value starts from 0 (0 - January, 1 - February and etc...).请注意, new Date()的月份值从 0 开始(0 - 一月,1 - 二月等......)。

var 
  a = new Date(2016, 01, 29), // Feb 29 2016 00:00:00
  b = new Date(2016, 02, 1); // Mar 01 2016 00:00:00

alert((+b - +a) / 1000 / 60 / 60 / 24); // 1 day

An expression (+b - +a) - returns you the difference between two dates in milliseconds (1 second = 1000 millisecond).表达式 (+b - +a) - 以毫秒为单位返回两个日期之间的差异(1 秒 = 1000 毫秒)。

As result you can convert:因此,您可以转换:

  • milliseconds to seconds: (+b - +a) / 1000 = 86400 seconds毫秒到秒: (+b - +a) / 1000 = 86400 秒

  • seconds to minutes: (+b - +a) / 1000 / 60 = 1440 minutes秒到分钟: (+b - +a) / 1000 / 60 = 1440 分钟

  • minutes to hours: (+b - +a) / 1000 / 60 / 60 = 24 hours分钟到小时: (+b - +a) / 1000 / 60 / 60 = 24 小时

  • hours to days: (+b - +a) / 1000 / 60 / 60 / 24 = 1 day小时到天: (+b - +a) / 1000 / 60 / 60 / 24 = 1 天

+a and +b - give you integer value representing the number of milliseconds since 1 January 1970 00:00:00 for each dates. +a 和 +b - 为您提供整数值,表示自 1970 年 1 月 1 日 00:00:00 以来每个日期的毫秒数。

Read more about new Date()阅读有关new Date() 的更多信息

The JavaScript date is based on a time value that is milliseconds since midnight 01 January, 1970 UTC. JavaScript 日期基于一个时间值,该时间值是自 UTC 1970 年 1 月 1 日午夜以来的毫秒数。 A day holds 86,400,000 milliseconds.一天有 86,400,000 毫秒。 The JavaScript Date object range is -100,000,000 days to 100,000,000 days relative to 01 January, 1970 UTC. JavaScript 日期对象范围是 -100,000,000 天到 100,000,000 天(相对于 UTC 1970 年 1 月 1 日)。

This code works for every case:此代码适用于每种情况:

      function fmtDate( when ) {
    function D2( val ) {
      return ( val < 10 ) ? '0' + val : '' + val;
    }
    return D2( when.getMonth() + 1 ) + '/' + D2( when.getDate() ) + '/' + when.getFullYear();
  }

  function workdays( d1, d2 ) {
    var result = 0;
    var d0 = new Date();
    var negative = 1;
    if ( ( typeof( d1 ) == typeof( d2 ) ) && ( typeof( d1 ) == typeof( d0 ) ) ) {
      if ( d2 < d1 ) {  // Exchange/swap the dates
        d0 = d2;
        d2 = d1;
        d1 = d0;
        negative = -1;
      }
      for ( d = d1; d < d2; d.setDate( d.getDate() + 1 ) ) {
       dow = d.getDay();     // Day Of Week: 0 (Sun) .. 6 (Sat)
       when = fmtDate( d );  // Formatted date
        if ( ( dow >= 0 ) && ( dow <= 6 )) {

            result++;
        }
      }
    } else {
      alert( 'workdays() - parameter error - date objects required.' );
    }
    return result
  }

and if you remove "=" from this line:如果您从此行中删除“=”:

if ( ( dow >= 0 ) && ( dow <= 6 ))

You can use this for working out how many workdays (excluding Sat and Sun)您可以使用它来计算工作日(不包括周六和周日)

Finaly good working code最终良好的工作代码

function count_days(){ 
            var $obj = "dd.mm.YYYY";
            var $obj2 = "dd.mm.YYYY";
            if($obj2.value){
                $start=$obj.value.split(".");
                var date1 = new Date($start[2],$start[1]-1,$start[0]); // Converted date to ("YYYY,mm,dd")
                var $stop=$obj2.value.split(".");
                var date2 = new Date($stop[2],$stop[1]-1,$stop[0]); // Converted date to ("YYYY,mm,dd")
                var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
                var diffDays = (date2.getTime() - date1.getTime())/(oneDay);
                if(diffDays >= 0){
                    return Math.abs(diffDays)+1; // positive as date1 > date2    
                } else {
                    return diffDays-1;  //negative  as date1 < date2
                }
            }
return false; // No date2 nothing to compare  
}

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

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