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


当前回答

简单的方法是,

var first = '2012-11-21';
var second = '2012-11-03';

if (new Date(first) > new Date(second) {
    .....
}

其他回答

Date对象将执行您想要的操作-为每个日期构造一个,然后使用>、<、<=或>=对它们进行比较。

==,!=,==,和!==运算符要求您使用date.getTime(),如中所示

var d1 = new Date();
var d2 = new Date(d1);
var same = d1.getTime() === d2.getTime();
var notSame = d1.getTime() !== d2.getTime();

明确地说,直接检查日期对象是否相等是行不通的

var d1 = new Date();
var d2 = new Date(d1);

console.log(d1 == d2);   // prints false (wrong!) 
console.log(d1 === d2);  // prints false (wrong!)
console.log(d1 != d2);   // prints true  (wrong!)
console.log(d1 !== d2);  // prints true  (wrong!)
console.log(d1.getTime() === d2.getTime()); // prints true (correct)

不过,我建议您使用下拉列表或类似的受约束的日期输入形式,而不是文本框,以免您陷入输入验证地狱。


对于好奇的date.getTime()文档:

返回指定日期的数值,即自1970年1月1日00:00:00 UTC以来的毫秒数。(之前的时间返回负值。)

注意-仅比较日期部分:

当我们在javascript中比较两个日期时。这需要数小时、数分钟和数秒的时间。。因此,如果我们只需要比较日期,这是一种方法:

var date1= new Date("01/01/2014").setHours(0,0,0,0);

var date2= new Date("01/01/2014").setHours(0,0,0,0);

现在:如果date1.valueOf()>date2.valueOf。

表演

今天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>

铬的结果

使用momentjs进行日期操作。


使用

isSameOrAfter()方法

moment('2010-10-20').isSameOrAfter('2010-10-20') //true;

使用isAfter()方法检查一个日期是否在另一个日期之后

moment('2020-01-20').isAfter('2020-01-21'); // false
moment('2020-01-20').isAfter('2020-01-19'); // true

使用isBefore()方法检查一个日期是否早于另一个日期。

moment('2020-01-20').isBefore('2020-01-21'); // true
moment('2020-01-20').isBefore('2020-01-19'); // false

使用isSame()方法检查一个日期与另一个日期是否相同

moment('2020-01-20').isSame('2020-01-21'); // false
moment('2020-01-20').isSame('2020-01-20'); // true

注意时区

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