【问题标题】:Strange error on 29.10.2011 till 31.10.2011 counting the nights wrong2011 年 10 月 29 日至 2011 年 10 月 31 日的奇怪错误数错了夜晚
【发布时间】:2011-09-21 11:36:59
【问题描述】:

我使用两个日期选择器来获取到达和离开日期,计算天数来计算夜数,一切都很好,除了一件事:如果我的开始日期是 2011 年 10 月 29 日,结束日期是 31 月 10 日。 2011 jquery 计算 3 晚,但只有 2 晚。只有在 10 月,其他月份仍然工作正常,希望有人能帮助我找出我的错误在哪里:

var oneDay = 1000*60*60*24; 
var difference = Math.ceil((arrivalDate.getTime() - departureDate.getTime()) / oneDay); 

【问题讨论】:

    标签: jquery datepicker


    【解决方案1】:

    问题是欧洲的夏令时结束于 10 月 30 日(根据德国错误消息,您在哪里)。因此,日期之间通常有 24+24+24=72 小时,在这种情况下,日期之间有 24+24+24+1=73 小时。因此,您的代码计算出日期之间有 2.041666 天。您的 Math.ceil 然后将其四舍五入为 3。

    在这种情况下,最简单的解决方案可能就是将Math.ceil 替换为Math.round。当 DST 结束时,您的 2.04166 天将四舍五入为 2 天。当 DST 开始时,您将计算的 1.95834 天也将四舍五入为 2 天。

    【讨论】:

    • +1,不错!这意味着 op 也应该考虑到 March。如果她不使用Ceil,而是使用Floor,十月会得到修复,但三月也会搞砸
    • Jandrejc,说得好。我添加了一个解决方案,应该在今年的两端都可以使用。
    • 我不知道 Javascript 被配置为适应夏令时。
    • Lazarus,如果你想一想,它必须能够做到这一点,以便为 getTime() 提供准确的答案——自 1970 年 1 月 1 日以来的毫秒数。更平淡地说,一个 DST 问题是获得提问者所描述的效果的唯一真实方法。
    • 我讨厌那个,第一条评论。我是对的。它被忽略了。 :(
    【解决方案2】:

    改变:

    var difference = Math.ceil((arrivalDate.getTime() - departureDate.getTime()) / oneDay); 
    

    到:

    var different = Math.Floor(arrivalDate.getTime() / oneDay) - Math.Floor(departureDate.getTime() / oneDay)
    

    【讨论】:

    • 你的答案解决了问题是对的——但它并没有解释问题是什么。这可能就是您的答案被忽略的原因。
    【解决方案3】:

    三月不应该搞砸,因为它只少了一个小时,所以如果我是正确的,它仍然可以达到 24 小时?

    问候拉尔夫

    【讨论】:

      【解决方案4】:

      以下正确地报告了 2 个“夜晚”或实际上是 2 天。

      var startDate = new Date(2011,10,29);
      var endDate = new Date(2011,10,31);
      var oneDay = 1000*86400;
      var difference = Math.ceil((endDate.getTime() - startDate.getTime())/oneDay);
      alert(difference);
      

      我怀疑问题出在 Date 对象的时间方面。您可以通过删除时间元素来“清理”输入。

      function JustDate(inputDate) {
          return new Date(inputDate.getFullYear(), inputDate.getMonth(), inputDate.getDate());
      }
      
      var departureDate = JustDate(departure.datepicker("getDate"));
      var arrivalDate = JustDate(arrival.datepicker("getDate"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-23
        • 1970-01-01
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        相关资源
        最近更新 更多