Moment JS日期时间比较


384

我正在使用moment.js格式化日期时间,这里有两个日期值,并且当一个日期大于另一个日期时,我想实现一种特定的功能。我阅读了他们的大多数文档,但没有找到实现此目的的功能。我知道会在那里。

这是我的代码:

var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'
var d = moment(date_time).tz('UTC'); // first date 

var now = new Date(),
    dnow = moment(now).tz('UTC'),
    snow = dnow.minute() % 15,
    diffnow = 15 - snow,
    tonow = moment(dnow).add('minute', diffnow),
    ahead30now = moment(tonow).add('minute', 30);

if (d > ahead30now) {
    // allow input time
    console.log('UTC TIME DB', d.format());
} else {

}

编辑

var date_time = req.body.date + 'T' + req.body.time + req.body.timezone; // 2014-03-24T01:15:000
var utc_input_time = moment(date_time).utc(); // 2014-03-24T01:15:000
console.log('utc converted date_time', moment(date_time).utc().format("YYYY-MM-DDTHH:mm:SSS"));
var isafter = moment(utc_input_time).isAfter(moment('2014-03-24T01:14:000')); // true
if(isafter === true){
    console.log('is after true');
} else {
    console.log('is after is false');
}

在这里,我正在比较两个日期,即2014-03-24T01:15:000 > 2014-03-24T01:14:000,期望第一个日期大于第二个日期,但是它总是转到else条件。不知道为什么

Answers:


540

我相信你正在寻找的查询功能isBeforeisSame,和isAfter

但是,要准确地说出您要尝试的内容有点困难。也许您只是想了解输入时间和当前时间之间的时差?如果是这样,考虑差异功能diff。例如:

moment().diff(date_time, 'minutes')

其他一些事情:

  • 第一行有错误:

    var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'

    那是行不通的。我想你的意思是:

    var date_time = '2013-03-24' + 'T' + '10:15:20:12' + 'Z';

    当然,您也可以:

    var date_time = '2013-03-24T10:15:20:12Z';
  • 您正在使用:.tz('UTC')错误。 .tz属于moment-timezone。除非您正在与其他时区配合使用,否则您无需使用它America/Los_Angeles

    如果要将值解析为UTC,请使用:

    moment.utc(theStringToParse)

    或者,如果要解析本地值并将转换为UTC,请使用:

    moment(theStringToParse).utc()

    或者,也许您根本不需要它。仅因为输入值使用UTC,并不意味着您必须在整个函数中都使用UTC。

  • 您似乎通过获得了“ now”实例 moment(new Date())。您可以改为使用moment()

更新

根据您的修改,我认为您可以执行以下操作:

var date_time = req.body.date + 'T' + req.body.time + 'Z';
var isafter = moment(date_time).isAfter('2014-03-24T01:14:00Z');

或者,如果您想确保您的字段被验证为正确的格式:

var m = moment.utc(req.body.date + ' ' + req.body.time, "YYYY-MM-DD  HH:mm:ss");
var isvalid = m.isValid();
var isafter = m.isAfter('2014-03-24T01:14:00Z');

1
感谢您的宝贵意见。我已经修改了代码,以包含您的评论,但未正确获得区别。您能检查我编辑过的代码
吗?Dibish

3
查看最新答案。还要在秒字段中查看位数。还有req.body.timezone什么比Z?如果是这样,该怎么办?
Matt Johnson-Pint 2014年

非常感谢您对代码的编辑,我已经快到了。 .utc()某个时间我得到了无效的日期
Dibish 2014年

1
当我输入+05:30时,效果很好。再次非常感谢您的好意
Dibish

.isSame()正是我想要的。以前在文档中以某种方式错过了它。
Will Strohl

231

您应该能够直接比较它们。

var date = moment("2013-03-24")
var now = moment();

if (now > date) {
   // date is past
} else {
   // date is future
}


87
我觉得值得解释一下,因为javascript会将对象强制转换为原语,Object.prototype.valueOf而原型在返回原始纪元时将其强制为数字。所以这类似于now.format('x') > date.format('x')
tandrewnichols

不,它不起作用...这是我尝试过的。// newDate高于现在的日期...因此它在上下两个条件下都无法打印。const resDate = res.url.expiryDate; const newDate = moment(resDate); var now = moment()。format(“ DD / MM / YYYY”); 如果(现在<newDate){console.log(“成功”); } else {console.log(“ fail”)}
史蒂夫

3
@steve moment().format("DD/MM/YYYY")将返回一个字符串,然后您将按字母顺序进行比较,然后12月1日将在1月2日之前,因为您也要以天开头。format()如果要直接比较瞬间目标,请不要使用。
ryanwinchester

28

Jsfiddle:http//jsfiddle.net/guhokemk/1/

 function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

如果dateTimeA大于dateTimeB,则该方法返回1

如果dateTimeA等于dateTimeB,则该方法返回0。

如果dateTimeA小于dateTimeB,则该方法返回-1。


1
函数compare1(dateTimeA,dateTimeB){返回力矩(dateTimeA,'MM / DD / YYYY')。diff(dateTimeB,'MM / DD / YYYY'); }
Shamseer

23

重要的是,你的日期时间处于正确的ISO格式使用任何的时候momentjs查询isBeforeisAfterisSameOrBeforeisSameOrAfterisBetween

因此,您的日期时间应该不是:2014-03-24T01:14:000,而是:

2014-03-24T01:14:002014-03-24T01:14:00.000Z

否则,您可能会收到以下弃用警告,并且条件将评估为false:

弃用警告:提供的值不是公认的RFC2822或ISO格式。此刻的构建工作归结于js Date(),它在所有浏览器和版本之间都不可靠。不建议使用非RFC2822 / ISO日期格式,并将在即将发布的主要版本中将其删除。请参阅 http://momentjs.com/guides/#/warnings/js-date/了解更多信息。

// https://momentjs.com/docs/#/query/

const dateIsAfter = moment('2014-03-24T01:15:00.000Z').isAfter(moment('2014-03-24T01:14:00.000Z'));

const dateIsSame = moment('2014-03-24T01:15:00.000Z').isSame(moment('2014-03-24T01:14:00.000Z'));

const dateIsBefore = moment('2014-03-24T01:15:00.000Z').isBefore(moment('2014-03-24T01:14:00.000Z'));

console.log(`Date is After: ${dateIsAfter}`);
console.log(`Date is Same: ${dateIsSame}`);
console.log(`Date is Before: ${dateIsBefore}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"
></script>


10

这样传递日期到瞬间,它将进行比较并给出结果。如果您不想格式化,请将其删除

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")

6
Be careful这只是比较两个字符串而已
Pranoy Sarkar

@PranoySarkar您能告诉我为什么我们需要更加小心吗?
DEEPESH KUMAR R


2

对于日期时间比较,您可以使用valueOf瞬间功能,该功能提供日期时间的毫秒数,最适合进行比较:

let date1 = moment('01-02-2020','DD-MM-YYYY').valueOf()
let date2 = moment('11-11-2012','DD-MM-YYYY').valueOf()

//     alert((date1 > date2 ? 'date1' : 'date2') + " is greater..."  )

if (date1 > date2) {
   alert("date1 is greater..." )
} else {
   alert("date2 is greater..." )
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>


1
        var startDate = moment(startDateVal, "DD.MM.YYYY");//Date format
        var endDate = moment(endDateVal, "DD.MM.YYYY");

        var isAfter = moment(startDate).isAfter(endDate);

        if (isAfter) {
            window.showErrorMessage("Error Message");
            $(elements.endDate).focus();
            return false;
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.