我将我的日期转换为moment.js,现在我想将它与另一个日期(在这种情况下为’now’)进行比较.
与日期对象进行简单比较似乎比使用moment.js isAfter函数快得多.
>这个简单的比较是否适用于所有语言环境?
>我在这里错过了什么吗?
>是否有一个非常具体的原因为什么isAfter似乎创建一个新的时刻对象而不是在它是一个Date对象时采用快捷方式?
我的所有日期都是UTC.
function executeTests() { isAfterTest(); compareTest(); } function isAfterTest() { console.time('isAfterTest'); var now = new Date(); var dateOfBirth = moment('2000-01-01'); for (var i = 0; i < 50000; i++) { var x = dateOfBirth.isAfter(now); } console.timeEnd('isAfterTest'); } function compareTest() { console.time('compareTest'); var now = new Date(); var dateOfBirth = moment('2000-01-01'); for (var i = 0; i < 50000; i++) { var x = dateOfBirth > now; } console.timeEnd('compareTest'); }
<script src="http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.7.0/moment-with-langs.js"></script> <button onclick="executeTests();">Run Test</button>
结果:
isAfterTest: 3754.000ms (index):32 compareTest: 24.000ms
解决方法
查看文档
http://momentjs.com/docs/,isAfter方法接受不同类型的Date格式:
moment().isAfter(Moment|String|Number|Date|Array);
这意味着它需要进行类型检查,然后在运行计算之前将其转换为日期对象.
减少这种影响的一种方法是传入一个Moment对象作为比较日期:
function isAfterTest() { console.time('isAfterTest'); var now = moment(); var dateOfBirth = moment('2000-01-01'); for (var i = 0; i < 50000; i++) { var x = dateOfBirth.isAfter(now); } console.timeEnd('isAfterTest'); }
我创造了一个比较小提琴,但这似乎并没有改善它:
http://jsfiddle.net/kmturley/t4grs0p7/7/
看看你的版本我相信你应该使用valueOf()方法来比较这些值:
window.compareTest2 = function() { console.time('compareTest2'); var now = moment().valueOf(); var dateOfBirth = moment('2000-01-01').valueOf(); for ( var i = 0; i < 50000; i++ ) var x = dateOfBirth > now; console.timeEnd('compareTest2'); }