【问题标题】:javascript date subtractionjavascript日期减法
【发布时间】:2009-08-18 17:36:41
【问题描述】:

我正在寻找一种在两个 javascript Date 对象之间进行适当减法并获得日期增量的方法。

这是我的方法,但它无法将今天的日期作为输入:

<script type="text/javascript">
function getDayDelta(incomingYear,incomingMonth,incomingDay){
var incomingDate = new Date(incomingYear,incomingMonth,incomingDay);
var today = new Date();

var delta = incomingDate - today;
var resultDate = new Date(delta);
return resultDate.getDate();
}
//works for the future dates:
alert(getDayDelta(2009,9,10));
alert(getDayDelta(2009,8,19));

//fails for the today as input, as expected 0 delta,instead gives 31:
alert(getDayDelta(2009,8,18));
</script>

对此有什么更好的方法?

【问题讨论】:

    标签: javascript datetime date


    【解决方案1】:

    Date 构造函数中的月份数是从零开始的,你应该减去一个,我认为使用时间戳计算增量更简单:

    function getDayDelta(incomingYear,incomingMonth,incomingDay){
      var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay),
          today = new Date(), delta;
      // EDIT: Set time portion of date to 0:00:00.000
      // to match time portion of 'incomingDate'
      today.setHours(0);
      today.setMinutes(0);
      today.setSeconds(0);
      today.setMilliseconds(0);
    
      // Remove the time offset of the current date
      today.setHours(0);
      today.setMinutes(0);
    
      delta = incomingDate - today;
    
      return Math.round(delta / 1000 / 60 / 60/ 24);
    }
    
    
    getDayDelta(2008,8,18); // -365
    getDayDelta(2009,8,18); // 0
    getDayDelta(2009,9,18); // 31
    

    【讨论】:

    • 感谢修复,但这似乎失败了:getDayDelta(2009,8,19); //应该返回 1 但返回 0(在我的本地时间是第 18 位)
    • @Crib:问题是incomingDate 的时间部分是 0 小时、0 分钟、0 秒和 0 毫秒。您必须对today 执行相同操作,否则您将在前一天/后一天获得部分天数。我已经编辑了答案以反映变化。
    • @CMS:您必须删除所有内容(小时、分钟、秒和毫秒),否则您将获得 0.99991513 的增量...
    • @Grant Wagner:这就是我在 return 语句中使用 Math.round 的原因。
    【解决方案2】:

    (2009,8,18) 不是 8 月 18 日。现在是 9 月 18 日。

    【讨论】:

    • 月份是从零开始的索引。 0 是一月。
    • 哦 javascript,你真有趣!
    【解决方案3】:

    您可以在每个日期对象上调用 getTime(),然后从较早的日期中减去后者。这将为您提供两个对象之间的毫秒数差异。从那里,很容易到达几天。

    不过,需要注意几个问题:1) 夏令时,2) 确保您的时间来自同一时区。

    【讨论】:

      【解决方案4】:

      这会更好,但它不能正确处理负结果值。您可能只想自己解析这些值并处理它们。

      function getDayDelta(incomingYear,incomingMonth,incomingDay){
      var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay);
      var today =   new Date();
      today = new Date(Date.parse(today.format("yyyy/MM/dd")));
      
      var delta = incomingDate - today;
      if (delta == 0) { return 0; }
      var resultDate = new Date(delta);
      return resultDate.getDate();
      }
      //works for the future dates:
      alert(getDayDelta(2009,9,10));
      alert(getDayDelta(2009,8,19));
      alert(getDayDelta(2009, 8, 18));
      

      【讨论】:

      • 是的,ASP .NET Ajax 框架扩展了客户端 Date 对象
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多