奇怪的Js时间计算方法,跨多个月后出现1天的误差

在项目中要求用计算两个时间相差的天数,通俗的说就是两个时间 相减,

我的方法 先把两个时间转成相应的毫秒,相减后,再除以(1000 * 60 * 60 * 24) 就可以得到对应天数,但天数会比实际少一天所以需要再加上一天

代码如下

复制代码
 function DateDiff() {
                  //startTime和endTime是18/12/2002格式   
                 var startTime = $("#<%=txtDepartureDate.ClientID %>").val();
                 var endTime = $("#<%=txtReturnDate.ClientID %>").val();
  
                 var newDate, sDate, eDate, iDays
  
                 newDate = startTime.split("/")
                 sDate = new Date(aDate[2], aDate[1]-1, aDate[0])
 
                 newDate = endTime.split("/")
                 eDate = new Date(aDate[2], aDate[1]-1, aDate[0])
                 iDays = Math.floor((eDate2 - sDate) / 86400000)
                 alert(iDays+1);
 }
复制代码

       当时测试没有跨好几个月,发现都没有问题,直到测试人员提了BUG然后自己仔细测终于发现了

BUG:开始日期为:06/08/2013     结束日期为:30/11/2013  计算的结果为116 

 然后将结束日期改为:01/12/2013 计算的结果居然为118,无缘无故的多出来了1天 

然后偿试换种写法方法式都是把时间转成毫秒后相减再除(1000 * 60 * 60 * 24) 结果都多了一天,

 最后查看了JS 文档才知道原来 Js Moth默认是从0开始的,所以应该把月都减1  

如 

Date(aDate[2], aDate[1]-1, aDate[0])
这样计算就会得到正确的天数

还有一种用C#代码去算也是可以的代码如下:

1             int nights =0;
2             if (!string.IsNullOrEmpty(startTime) && !string.IsNullOrEmpty(endTime))
3             {
4                 System.TimeSpan td = Convert.ToDateTime(endTime) - Convert.ToDateTime(startTime);
5                 nights = td.Days + 1;
6               
7             }

 

posted @   Zery  阅读(1511)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示