有人能提出一种方法来比较两个大于、小于和过去不使用JavaScript的日期的值吗?值将来自文本框。


当前回答

到目前为止,最简单的方法是从另一个日期中减去一个日期并比较结果。

var oDateOne=新日期();var oDateTwo=新日期();警报(oDateOne-oDateTwo==0);警报(oDateOne-oDateTwo<0);警报(oDateOne-oDateTwo>0);

其他回答

为了在众多现有选项中添加另一种可能性,您可以尝试:

if (date1.valueOf()==date2.valueOf()) .....

…这似乎对我有用。当然,你必须确保这两个日期都没有定义。。。

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) .....

通过这种方式,我们可以确保如果两者都未定义,或者。。。

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) .....

…如果你希望他们不平等。

注意时区

javascript日期没有时区的概念。这是一个时刻(从大纪元开始计时),具有方便的函数,用于在“本地”时区中转换字符串。如果您想使用日期对象处理日期,正如这里的每个人所做的那样,您希望您的日期在所讨论的日期开始时表示UTC午夜。这是一个常见且必要的惯例,允许您处理日期,而不考虑创建日期的季节或时区。因此,您需要非常警惕地管理时区的概念,尤其是在创建午夜UTC日期对象时。

大多数时候,您都希望您的日期反映用户的时区。如果今天是你的生日,请单击。新西兰和美国的用户同时点击并获得不同的日期。在这种情况下,这样做。。。

// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

有时,国际可比性胜过本地准确性。在这种情况下,这样做。。。

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCYear(), myDate.getyUTCMonth(), myDate.getUTCDate()));

现在你可以像其他答案所建议的那样直接比较你的约会对象。

在创建时注意管理时区,在转换回字符串表示形式时还需要确保将时区排除在外。因此,您可以安全地使用。。。

到ISOString()getUTCxxx()getTime()//返回一个没有时间或时区的数字。.toLocaleDateString(“fr”,{timezone:“UTC”})//任何您想要的语言环境,但始终是UTC。

完全避免其他一切,特别是。。。

getYear()、getMonth()和getDate()

如果以下是您的日期格式,您可以使用此代码:

var first = '2012-11-21';
var second = '2012-11-03';
if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){
   //...
}

将检查20121121号是否大于20121103号。

“一些”发布的代码的改进版本

/* Compare the current date against another date.
 *
 * @param b  {Date} the other date
 * @returns   -1 : if this < b
 *             0 : if this === b
 *             1 : if this > b
 *            NaN : if a or b is an illegal date
*/ 
Date.prototype.compare = function(b) {
  if (b.constructor !== Date) {
    throw "invalid_date";
  }

 return (isFinite(this.valueOf()) && isFinite(b.valueOf()) ? 
          (this>b)-(this<b) : NaN 
        );
};

用法:

  var a = new Date(2011, 1-1, 1);
  var b = new Date(2011, 1-1, 1);
  var c = new Date(2011, 1-1, 31);
  var d = new Date(2011, 1-1, 31);

  assertEquals( 0, a.compare(b));
  assertEquals( 0, b.compare(a));
  assertEquals(-1, a.compare(c));
  assertEquals( 1, c.compare(a));

表演

今天2020.02.27我在MacOs High Sierra v10.13.6上对Chrome v80.0、Safari v13.0.5和Firefox 73.0.1上选择的解决方案进行了测试

结论

所有浏览器的解决方案d1==d2(D)和d1==d2(E)最快解决方案getTime(A)比valueOf(B)快(两者都是中速)解决方案F、L、N对于所有浏览器来说都是最慢的

细节

下面的代码片段中介绍了性能测试中使用的解决方案。您可以在您的机器上执行测试

函数A(d1,d2){return d1.getTime()==d2.getTime);}函数B(d1,d2){返回d1.valueOf()==d2.valueOf();}函数C(d1,d2){返回数字(d1)==数字(d2);}函数D(d1,d2){返回d1==d2;}函数E(d1,d2){返回d1==d2;}函数F(d1,d2){返回(!(d1>d2||d2>d1));}函数G(d1,d2){返回d1*1==d2*1;}函数H(d1,d2){返回+d1==+d2;}函数I(d1,d2){回来(+d1-+d2);}函数J(d1,d2){回来(d1-d2);}函数K(d1,d2){返回d1-d2==0;}函数L(d1,d2){回来((d1>d2)-(d1<d2));}函数M(d1,d2){return d1.getFullYear()==d2.getFullYear()&&d1.getDate()==d2.getDate&&d1.getMonth()==d2.getMont();}函数N(d1,d2){return(isFinite(d1.valueOf())&&isFinite!((d1>d2)-(d1<d2)):假);}//测试let过去=新日期('2002-12-24');//过去的let now=新日期('2020-02-26');//现在console.log('代码d1>d2 d1<d2 d1=d2')var log=(l,f)=>console.log(`${l}${f(现在,过去)}${f(过去,现在)}${f(现在、现在)}`);日志('A',A);日志('B',B);日志('C',C);日志('D',D);对数('E',E);日志('G',G);对数('H',H);日志('I',I);日志('J',J);log('K',K);对数('L',L);日志(M’,M);对数('N',N);p{颜色:红色}<p>此代码段仅显示已测试的解决方案(它本身不执行测试)</p>

铬的结果