2

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

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就是这样工作的。您可以在此处查看我对该函数的实现,以获取次优日期交换的示例。

在此先感谢您的帮助!

4

3 回答 3

2

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

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

无需创建第三个日期?

这就是使用变量的意义所在。使用您提到的二元运算符方式,您需要将 Date 对象转换为整数,应用该操作,然后从整数创建两个新的 Date 对象。

于 2013-01-21T02:29:35.103 回答
1

如果您对拥有额外 Date 的约束应该被解释为根本没有另一个变量,那么我有一个基于此人对内联变量交换的绝妙想法的解决方案:

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);
}
于 2013-01-21T02:29:46.400 回答
0

我不确定是否了解您的需求,但是,如果您将时间戳传递给startand finish,则使用如下内容:

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);

编辑:

但是,可以测试即使使用三元运算符,性能也低于经典if..else语句。

希望这可能会有所帮助。

于 2013-01-21T02:49:44.090 回答