Momento js fecha hora comparación


384

Estoy usando moment.js para formatear mi fecha y hora, aquí tengo dos valores de fecha y quiero lograr una función particular cuando una fecha es mayor que la otra. Leí la mayoría de sus documentos, pero no encontré la función para lograr esto. Sé que estará allí.

Este es mi código:

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 {

}

Editar

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');
}

Aquí, estoy comparando dos fechas 2014-03-24T01:15:000 > 2014-03-24T01:14:000, es decir , esperando que la primera sea mayor que la segunda, pero siempre pasa a la condición else. No se por que

Respuestas:


540

Creo que busca las funciones de consulta , isBefore, isSame, y isAfter.

Pero es un poco difícil saber exactamente lo que estás intentando. ¿Quizás solo está buscando obtener la diferencia entre la hora de entrada y la hora actual? Si es así, considere la función de diferencia , diff. Por ejemplo:

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

Algunas otras cosas:

  • Hay un error en la primera línea:

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

    Eso no va a funcionar. Creo que quisiste decir:

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

    Por supuesto, también podrías:

    var date_time = '2013-03-24T10:15:20:12Z';
  • Estás usando: .tz('UTC')incorrectamente. .tzpertenece al momento-zona horaria . No necesita usar eso a menos que esté trabajando con otras zonas horarias, como America/Los_Angeles.

    Si desea analizar un valor como UTC, use:

    moment.utc(theStringToParse)

    O, si desea analizar un valor local y convertirlo a UTC, use:

    moment(theStringToParse).utc()

    O tal vez no lo necesitas en absoluto. El hecho de que el valor de entrada esté en UTC no significa que tenga que trabajar en UTC durante toda su función.

  • Parece que está recibiendo la instancia "ahora" moment(new Date()). En su lugar, solo puede usar moment().

Actualizado

Según tu edición, creo que puedes hacer esto:

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

O, si desea asegurarse de que sus campos estén validados para tener el formato correcto:

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
Gracias por sus valiosos comentarios. He editado mi código para incluir sus comentarios pero no obtengo la diferencia correctamente. ¿Puedes consultar mi código editado
Dibish

3
Ver respuesta actualizada. Observe también la cantidad de dígitos en el campo de segundos. ¿Y req.body.timezonealguna vez hay algo más que Z? ¿Entonces qué?
Matt Johnson-Pint

Muchas gracias por su código editado, casi he llegado allí. En mi caso, tengo ese número de zona horaria del lado del usuario, por ejemplo, date_time = 2014-03-25T23: 10 + 5: 30, cuando uso moment (date_time) .utc () algún tiempo que me dieron la fecha no válida
Dibish

1
Cuando pongo +05: 30 funciona muy bien. Una vez más, muchas gracias por su amabilidad
Dibish

.isSame () es exactamente lo que estaba buscando. De alguna manera lo perdí en los documentos antes.
Will Strohl el

232

Debería poder compararlos directamente.

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

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


88
Siento que vale la pena explicar que esto funciona porque JavaScript obliga a los objetos a primitivas a través de las Object.prototype.valueOfcuales se anula en el prototipo de momento para devolver una marca de tiempo de época como un número. Entonces esto es similar a now.format('x') > date.format('x').
tandrewnichols

no, no funciona ... esto es lo que probé. // newDate es más alto que la fecha actual ... por lo que imprime falla tanto en grandes como en menores condiciones const resDate = res.url.expiryDate; const newDate = moment (resDate); var ahora = momento (). formato ("DD / MM / AAAA"); if (ahora <newDate) {console.log ("éxito"); } else {console.log ("fail")}
steve

3
@steve moment().format("DD/MM/YYYY")devolverá una cadena y luego está comparando alfabéticamente y luego el 1 de diciembre vendría antes del 2 de enero, porque también está liderando con días. No lo use format()si desea comparar los objetos de momento directamente.
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"));

El método devuelve 1 si dateTimeA es mayor que dateTimeB

El método devuelve 0 si dateTimeA es igual a dateTimeB

El método devuelve -1 si dateTimeA es menor que dateTimeB


1
función compare1 (dateTimeA, dateTimeB) {momento de retorno (dateTimeA, 'MM / DD / AAAA'). diff (dateTimeB, 'MM / DD / AAAA'); }
Shamseer

23

Es importante que su fecha y hora es correcta en el formato ISO cuando se utiliza cualquiera de las consultas momentjs : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

Entonces, en lugar de 2014-03-24T01: 14: 000, su fecha y hora debe ser:

2014-03-24T01: 14: 00 o 2014-03-24T01: 14: 00.000Z

de lo contrario, puede recibir la siguiente advertencia de desaprobación y la condición se evaluará como falsa:

Advertencia de desuso: el valor proporcionado no está en un formato RFC2822 o ISO reconocido. la construcción de momento se remonta a js Date (), que no es confiable en todos los navegadores y versiones. Se desaconsejan los formatos de fecha que no sean RFC2822 / ISO y se eliminarán en una próxima versión principal. Consulte http://momentjs.com/guides/#/warnings/js-date/ para obtener más información.

// 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

pasar fecha a momento como este se comparará y dará resultado. si no quieres formatearlo quítalo

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

66
Be carefulesto no es más que comparar dos cuerdas
Pranoy Sarkar

@PranoySarkar, ¿podría decirme por qué debemos ser más cuidadosos?
KUMAR R PROFUNDO


2

para la comparación de fecha y hora, puede usar la valueOffunción del momento que proporciona milisegundos de la fecha y hora, lo que es mejor para la comparación:

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;
        }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.