Javascript 如何计算日期对象是否更接近某个日期

Javascript 如何计算日期对象是否更接近某个日期,javascript,date,Javascript,Date,我正在构建一个日历,人们可以在其中从可视日历中选择一系列的日期 单击某个日期将选择它作为“开始”或“结束”日期。例如,如果我点击1月1日和1月5日。1月1日为“开始”日期,1月5日为“结束”日期。简单,对吗 现在的问题是,如果用户点击一个新的日期,我需要更新当前的“从”和“到”日期。使用 stringToDate(date.dateTime)>stringToDate(this.state.fromDate) 让我知道,如果传入日期晚于当前的“起始日期”,我可以使用将当前的“截止日期”更改为传入

我正在构建一个日历,人们可以在其中从可视日历中选择一系列的日期

单击某个日期将选择它作为“开始”或“结束”日期。例如,如果我点击1月1日和1月5日。1月1日为“开始”日期,1月5日为“结束”日期。简单,对吗

现在的问题是,如果用户点击一个新的日期,我需要更新当前的“从”和“到”日期。使用

stringToDate(date.dateTime)>stringToDate(this.state.fromDate)

让我知道,如果传入日期晚于当前的“起始日期”,我可以使用将当前的“截止日期”更改为传入日期,因为1月7日在1月5日之后,“必须”表示用户希望更新其“截止日期”

类似的函数对“from”日期执行相同的操作。这非常有效,但这意味着用户不能选择一个比原始“开始”日期晚的“开始”日期

我想要实现的是:计算传入日期是否更接近“开始”日期或“结束”日期。因此,如果用户从1月1日和5日开始,并在1月2日单击,我可以假设他想要更新他的“开始”日期

我当前的函数如下所示:

handleFromDateSelected(date) {
    let updatedFromDate = '';
    let updatedToDate = '';

    if (this.state.fromDate) {
        if (stringToDate(date.dateTime) > stringToDate(this.state.fromDate)) {
            updatedFromDate = this.state.fromDate;
            updatedToDate = date.dateTime;
        } else {
            updatedFromDate = date.dateTime;
            updatedToDate = this.state.fromDate;
        }
    } else {
        updatedFromDate = date.dateTime;
    }

    this.setState({
        fromDate: updatedFromDate,
        toDate: updatedToDate,
    });
}
就你而言

 var firstDate = new Date(date.dateTime);
 var secondDate = new Date(this.state.fromDate)
          if (firstDate.getTime() > secondDate .getTime()){
  // do something here 
  }
就你而言

 var firstDate = new Date(date.dateTime);
 var secondDate = new Date(this.state.fromDate)
          if (firstDate.getTime() > secondDate .getTime()){
  // do something here 
  }

如果您真的想检查新日期的截止日期,我认为这不是一个好的选择,您可以将所有3个日期(从、到和新)转换为时间戳,并比较绝对差异。最低的一个意味着这更接近新的一个

在示例中,假设
dateFrom
dateTo
newDate
是日期对象:

//Returns true if newDate is closer to dateFrom
function isFromDateCloser(dateFrom, dateTo, newDate)
{
    timeStampFrom = dateFrom.getTime();
    timeStampTo = dateTo.getTime();
    timeStampNew = newDate.getTime();

    return (Math.abs(timeStampFrom - timeStampNew) < Math.abs(timeStampTo - timeStampNew));
}

if (isFromDateCloser(dateFrom, dateTo, newDate))
    dateFrom = newDate;
else
    dateTo = newDate;
//如果newDate更接近dateFrom,则返回true
函数isFromDateCloser(dateFrom、dateTo、newDate)
{
timeStampFrom=dateFrom.getTime();
timeStampTo=dateTo.getTime();
timeStampNew=newDate.getTime();
return(Math.abs(timeStampFrom-timeStampNew)

在那个例子中,我任意选择了,如果新日期严格地介于两个日期之间,那么新日期将是dateTo。如果您希望“从”成为新日期,请在返回中替换
如果您真的想检查新日期的结束日期,在我看来,这不是一个好的选择,您可以将所有3个日期(从、到和新)转换为时间戳,并比较绝对差异。最低的一个意味着这更接近新的一个

在示例中,假设
dateFrom
dateTo
newDate
是日期对象:

//Returns true if newDate is closer to dateFrom
function isFromDateCloser(dateFrom, dateTo, newDate)
{
    timeStampFrom = dateFrom.getTime();
    timeStampTo = dateTo.getTime();
    timeStampNew = newDate.getTime();

    return (Math.abs(timeStampFrom - timeStampNew) < Math.abs(timeStampTo - timeStampNew));
}

if (isFromDateCloser(dateFrom, dateTo, newDate))
    dateFrom = newDate;
else
    dateTo = newDate;
//如果newDate更接近dateFrom,则返回true
函数isFromDateCloser(dateFrom、dateTo、newDate)
{
timeStampFrom=dateFrom.getTime();
timeStampTo=dateTo.getTime();
timeStampNew=newDate.getTime();
return(Math.abs(timeStampFrom-timeStampNew)

在那个例子中,我任意选择了,如果新日期严格地介于两个日期之间,那么新日期将是dateTo。如果您希望“起始日期”成为新日期,请在返回
中进行替换,这将对用户的选择进行假设。我是一个用户,我选择1月1日(从),然后选择1月5日(到)。然后,我改变主意,决定我的“到”日期是1月2日,然后我的“从”日期是1月2日,我的“到”日期是1月5日。这不是我想要的。为什么不使用两个日期选择器,一个“从”和一个“到”?或者每次他选择一个新的日期时重置从和到。问题是,设计师希望两个日历彼此相邻。虽然效果很好,但它们必须相隔1个月,例如1月和2月。如果用户希望从同一个月选择2个日期,则需要使用相同的输入。就像来自的日期选择器:此日期选择器的工作方式不同。您可以根据单击的日期更改起始日期或结束日期。这将对用户的选择进行假设。我是一个用户,我选择1月1日(从),然后选择1月5日(到)。然后,我改变主意,决定我的“到”日期是1月2日,然后我的“从”日期是1月2日,我的“到”日期是1月5日。这不是我想要的。为什么不使用两个日期选择器,一个“从”和一个“到”?或者每次他选择一个新的日期时重置从和到。问题是,设计师希望两个日历彼此相邻。虽然效果很好,但它们必须相隔1个月,例如1月和2月。如果用户希望从同一个月选择2个日期,则需要使用相同的输入。就像来自的日期选择器:此日期选择器的工作方式不同。您可以根据所单击的日期更改“从”或“到”。只需检查传入日期是否晚于当前日期。这是我目前的工作。这只是检查传入日期是否晚于当前日期。这就是我目前的工作。谢谢你的工作回答,不过我已经说服了设计师让我使用两种不同的输入,就像Booking.com一样。这将使事情变得更容易。这确实是一个更好的选择,而不是猜测用户的想法。谢谢你的工作答案,但是,我已经说服设计师让我使用两种不同的输入,就像Booking.com一样。这将使事情变得更容易。这确实是一个更好的选择,而不是猜测用户的想法