La comprobación de si ha transcurrido un mes desde la fecha en formato de cadena(JS)

0

Pregunta

En mi aplicación JavaScript que estoy recibiendo una fecha en una cadena de formato, como este: 19/10/2021 (dd/mm/aaaa). Quiero comprobar si ha pasado un mes desde dicha fecha y el retorno de una verdadera si es así. Estoy tratando de hacer algo similar al siguiente código, pero no está funcionando.

Me estoy poniendo alguna extraña valores cuando trato de depuración con la consola.registros y tal, soy un novato en js, así que no sé donde estoy haciendo las cosas mal.

var q = new Date();
var d = q.getDate();
var m = q.getMonth() + 1; //+1 because january is 0 and etc
var y = q.getFullYear();

var today = new Date(d, m, y);

mydate = userDate; // this is the string the app is receiving

if (today - mydate > 30) {
    return true;
} else {
    return false;
}

Gracias de antemano.

date javascript
2021-11-23 20:24:55
5
0

Intente esto:

    var q = new Date();
    var d = q.getDate();
    var m = q.getMonth(); 
    var y = q.getFullYear();
    var today = new Date(y,m,d);
    var mydate = new Date("2021-11-22"); 
    if(((today - mydate)/ (1000 * 60 * 60 * 24)) > 30)
    {
        return true;
    }
    else
    {
      return false;
    }
2021-11-23 20:53:55
0

En primer lugar, cuando se establece q a new Date() es hoy en día. No hay necesidad de sacar de él el día, el mes y el año y, a continuación, establezca de nuevo. Así que para el día de hoy puedes hacer var today = new Date().

Secound, debe pasar a Date() y,m,d y no d,m,y.

En tercer lugar, si usted resta una fecha a partir de la otra, el cálculo será en milisecounds, no en días.

Esto debería funcionar:

var userDate = '19/10/2021';
var myDate = new Date(userDate.split('/').reverse());
var today = new Date();

var thirtyDays = 1000*60*60*24*30;

return today - myDate > thirtyDays;
2021-11-23 22:09:04

new Date(userDate.split('/').reverse()) es casi seguro que devolver una Fecha no válida.
RobG

@RobG si userDate es una cadena con el formato dd/mm/aaaa, entonces userDate.split('/').reverse() volverá matriz como [yyyy,mm,dd]. y esto es lo que el constructor Date() está recibiendo como parámetros.
Mordy Stern

Estás pasando un valor único, una matriz. Ver ECMA-262 y mi comentario sobre esta respuesta.
RobG
0

Debido a que la definición de "la edad en meses" es... flexible, la forma más fácil es usar un poco de aritmética como se podría calcular en tu cabeza, y no involucrar a la Date clase.

Para la [a] de la interpretación humana de "la edad en meses", la regla es

  • Calcular la diferencia entre dos fechas en meses, como si el día-de-la-mes fue el día 1 del mes para ambas fechas

  • Restar 1 a excluir el final de mes

  • Entonces, si el día-de-la-mes del último día del plazo es en o después del día-de-la-mes del primer día del período, el [potencialmente parcial] final de mes es completa: añadir 1 para restaurar el recuento

La mosca en el ungüento es, desde hace meses contienen diferente número de días, se ocupan de los casos donde los 2 meses difieren en su número de días.

Si, sin embargo, el fin de mes es más corto que el mes de inicio, usted puede entrar en una situación en la que la condición de frontera nunca se pueden cumplir (por ejemplo, la fecha de inicio es el 28 de febrero y la fecha de finalización es el 31 de Marzo. Para arreglar eso, usted tiene que mirar en el "fin de mes" como una ventana que van desde el último día del mes de inicio hasta el último día del fin de mes inclusive.

Que lleva a este código. Estoy usando una estructura como la siguiente para representar una fecha:

{
  year:  2021 , // 4-digit year
  month:   11 , // month of year (1-12 mapping to January-December)
  day:     23   // day of month (1-[28-31] depending on year/month
}

Asegurar que los datos en que se estructura representa una fecha válida se deja como ejercicio para el lector.

El código no es tan complicado:

/**
 * 
 * @param {object} bgn       - start date of period
 * @param {number} bgn.year  - 4-digit year
 * @param {number} bgn.month - month of year [1-12]
 * @param {number} bgn.day   - day of month [1-31]
 * 
 * @param {object} end       - end date of period
 * @param {number} end.year  - 4-digit year
 * @param {number} end.month - month of year [1-12]
 * @param {number} end.day   - day of month [1-31]
 * 
*/
function diffInMonths( bgn , end ) {
  const between = ( x , min , max ) => x >= min && x <= max;

  // We'll need to add back the final month based on the following:
  // - end.day >=  bgn.day -- we've passed the month boundary, or
  // - end.day is within the end-of-month window
  //   (when the end month is shorter than the start month)
  const needAdjustment = end.day >= bgn.day
    || between( end.day, daysInMonth(bgn), daysInMonth(end) );
  const finalMonthAdjustment = needsAdjustment ? 1 : 0;

  const deltaM = 12 * ( end.year - bgn.year )
    + ( end.month - bgn.month )
    - 1                    // remove the final month from the equation
    + finalMonthAdjustment // add in the precomputed final month adjustment
    ;

  return deltaM;
}

/**
 * 
 * @param {object} dt       - date
 * @param {number} dt.year  - 4-digit year
 * @param {number} dt.month - month of year [1-12]
 * @param {number} dt.day   - day of month [1-31]
 *
 */
function daysInMonth(dt) {
  const leapYear = ( dt.year % 4 === 0 && dt.year % 100 !== 0 ) || dt.year % 400 === 0;
  const monthDays = leapYear ? daysPerMonthLeap : daysPerMonth;
  const days = monthDays[dt.month];
  return days;
}
//                                    jan feb mar apr may jun jul aug sep oct nov dec
//                         ---------- --- --- --- --- --- --- --- --- --- --- --- ---
const daysPerMonth     = [ undefined, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, ];
const daysPerMonthLeap = [ undefined, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, ];
2021-11-23 20:49:22
-1

El problema es que le están restando una cadena a partir de la fecha. Usted necesita mydate a ser el mismo tipo como hoy.

mydate = new Date(userDate)

(Nota: Esto sólo funciona con "mes/día/año" formato

2021-11-24 04:30:59

"Esto sólo funciona con "mes/día/año" formato" no es correcto, construido en los analizadores se parse (correctamente o no) una multitud de formatos, a menudo con resultados diferentes. Consejo General es "no utilizar el analizador integrado", en manual de análisis d/m/y no es difícil.
RobG
-1

Si su fecha es en este formato (19/10/2021) en primer lugar puede extraer de ellos.

const thOneMonth = 1000*60*60*24*31 //31 days in milliseconds
let formated = '19/10/2021'.split('/')
let date = Date.parse(formated[2], formated[1]-1, formated[0])
let date2 = 1634591678400 //date + 2678400000 a month later. This is in UNIX format.
if(date + thOneMonth == date2 ){//31 days 
  //A month have passed  
  console.log(date + thOneMonth )
}

Si quiere saber si es por ejemplo, el 12 de septiembre y la próxima fecha es el 12 de octubre, Usted tiene que considerar que septiembre es de 30 días. Usted tiene que comprobar basado en 31/30/29/28-día de los meses.


const thMonth = 1000*60*60*24*30 //30 days in milliseconds
let formated = '19/10/2021'.split('/')
let date = new Date(formated[2], formated[1]-1, formated[0])// make months start from 0
let date2 = 1634591678400 //date + 2678400000 a month later
if([5,7,10,12].includes(date.getMonth()+1) && Date.parse(date) + thMonth == date2 ){ // 30 days months 1000*60*60*24*30 //it won't enter here
  //A month have passed  
  console.log(date + thMonth)
}

2021-11-23 20:59:52

Date.parse('19/10/2021'.split('/').reverse()) es seriamente deficiente, efectivamente es Date.parse('2021,10,19') que devuelve NaN en al menos algunas, si no todas, las implementaciones. Ver ¿por Qué la Fecha.analizar dar resultados incorrectos? y MDN: Fecha.analizar.
RobG

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................