【问题标题】:How to swap two dates in JavaScript如何在 JavaScript 中交换两个日期
【发布时间】:2013-01-21 01:58:25
【问题描述】:

我在 JavaScript 中有两个日期,startfinish,由 Moment.js 解析。如果startfinish 之后而不需要创建第三个日期,那么交换它们的最有效方法是什么?通常,日期将是这样一个函数的参数:

function getDates(start, finish) {
  var start_date = moment(new Date(start));
  var finish_date = moment(new Date(finish));
  if (start_date.diff(finish_date) > 0) {
    // Swap code goes here...
  }
}

人们可能想要交换日期的原因是因为某些函数的定义方式是即使交换日期也会返回相同的结果,但该函数需要知道哪个日期更早。例如,Microsoft Excel 中的YEARFRAC 就是这样工作的。您可以查看我对该函数 here 的实现,以获取次优日期交换的示例。

提前感谢您的帮助!

【问题讨论】:

  • 您知道您可以从字面上获取某个日期的 MS 时间,然后将其设置为另一个日期,类似于 (new Date().getTime()) 然后在另一个日期上设置日期跨度>
  • 为什么不能有第三个变量? var x = start_date;开始日期 = 完成日期;完成日期 = x。这样您就不会创建 第三个日期,尽管我怀疑 第三个变量 就是您的意思。如果是这样,为什么这是一个约束?
  • 我不知道你是否应该四处交换日期,除非一个比另一个异常热......
  • 只是尽量提高效率。对于带有二元运算符的数字,有很多方法可以做到这一点,我很想知道是否有人设计了一种方法来对日期做类似的事情。
  • @thang,我添加了解释为什么需要进行这种交换。

标签: javascript momentjs


【解决方案1】:

如果开始在结束之后,交换它们的最有效方法是什么

带有第三个变量。为了好玩,您可以使用destructuring assignment防止在语法上围绕它工作,但这几乎不会产生性能差异。

无需创建第三个约会对象?

这就是使用变量的意义所在。对于您提到的 binary operator way,您需要将 Date 对象转换为整数,应用操作,然后从整数创建 两个新的 Date 对象。

【讨论】:

    【解决方案2】:

    如果您对增加 Date 的限制应该被解释为根本没有其他变量,那么我有一个基于 this person's brilliant idea for inline variable swapping 的解决方案:

    function getDates(start, finish) {
        var start_date = new Date(2013, 0, 5);
        var finish_date = new Date(2013, 0, 4);
        start_date = start_date.getTime();
        finish_date = finish_date.getTime();
        start_date = -(finish_date = (start_date += finish_date) - finish_date) + start_date;
        start_date = new Date(start_date);
        finish_date = new Date(finish_date);
        alert(start_date);
        alert(finish_date);
    }
    

    【讨论】:

    • 您知道这是按字符串序列化对日期进行排序的吗?
    • 我明白了,但这告诉我,我可能正在尝试为一个实际上并不存在的问题找到解决方案。可能只需要第三个变量,其他任何事情都会更复杂,效率更低。
    • 我已修改我的回复以删除阵列解决方案。无论如何,我的第二个建议(在上面仍然可见)更符合您的问题,@Bergi 的评论使我意识到字符串序列化的某些方面我没有考虑到数组排序方法。数组解决方案可以使用最少的额外代码来工作——但既然你已经承认第三个 Date 是最好的方法,我只是删除了错误的行而不是重新编写它们.
    【解决方案3】:

    我不确定是否理解您的需求,但是,如果您将时间戳传递给 startfinish,如下所示:

    start_date = start > finish ? finish : start;
    finish_date = start > finish ? start : finish;
    

    您在没有第三个临时变量的情况下交换值。然后您可以创建时刻对象并使用它们。例如:

    function dateDiff( start, finish, measure ){
      var start_date = start > finish ? finish : start, 
          finish_date = start > finish ? start : finish;
      return moment(finish_date).diff(moment(start_date), measure);
    }
    
    dateDiff( new Date(2013,1,21), new Date(2013,1,28), 'days' ) // 7
    dateDiff( new Date(2013,1,28), new Date(2013,1,21), 'days' ) // 7
    

    如果您只需要知道积极的差异,您甚至可以这样做:

    date_diff = (start < finish ? finish : start) - (start < finish ? start : finish);
    

    编辑:

    但是,to test 可能即使使用三元运算符,其性能也低于经典的 if..else 语句。

    希望这可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 2013-01-24
      相关资源
      最近更新 更多