Vérifier si un mois s'est écoulé depuis une date dans un format de chaîne(JS)

0

La question

Dans mon JavaScript de l'application, je reçois une date dans un format de chaîne de caractères, comme ceci: 19/10/2021 (jj/mm/aaaa). Je veux vérifier si un mois est passé depuis cette date, et de retourner vrai si. Je suis en train d'essayer quelque chose comme le code suivant, mais il ne fonctionne pas.

Je suis un peu bizarre valeurs lorsque j'essaie de débogage avec la console.les journaux et tel, je suis un débutant en js donc je ne sais pas où je suis en train de faire des trucs faux.

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

Merci à l'avance.

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

Essayez ceci:

    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

Tout d'abord, lorsque vous définissez q pour new Date() il est aujourd'hui. Il n'y a pas besoin d'obtenir de lui le jour, le mois et l'année puis le configurer à nouveau. Donc, pour aujourd'hui, vous pouvez simplement faire var today = new Date().

Secound, vous devriez passer en Date() y,m,d et pas d,m,y.

Troisièmement, si vous soustraire une date à partir d'un autre, le calcul sera sur milisecounds, pas jours.

Cela devrait fonctionner:

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()) sera presque certainement revenir à une Date non valide.
RobG

@RobG si userDate est une chaîne de caractères dans le format jj/mm/aaaa, puis userDate.split('/').reverse() sera de retour tableau comme [yyyy,mm,dd]. et c'est ce que le constructeur Date() est prise en tant que paramètres.
Mordy Stern

Vous transmettez une valeur unique, un tableau. Voir ECMA-262 et mon commentaire sur cette réponse.
RobG
0

Parce que la définition de "mois" est... flexible, le plus simple est d'utiliser un peu d'arithmétique, comme vous le feriez de calcul dans votre tête, et ne pas impliquer l' Date classe.

Pour le [a] de l'homme de l'interprétation de "l'âge en mois", la règle est

  • Calculer la différence entre les deux dates dans le mois, comme si le jour du mois est le 1er du mois pour les deux dates

  • Soustraire 1 pour exclure le dernier mois

  • Ensuite, si le jour du mois du dernier jour de la période est sur ou après le jour-de-la-mois de la première journée de la période, le [potentiellement partielle] dernier mois est complet: ajouter 1 à restaurer le comte

Une mouche dans la soupe est, depuis des mois contenir un nombre différent de jours, traitant les cas où les 2 mois qui diffèrent par leur nombre de jours.

Si, cependant, à la fin du mois est plus court que le mois de départ, vous pouvez vous retrouver dans une situation où la condition à la limite ne peut jamais être remplies (par exemple, la date de début est le 28 février et la date de fin le 31 Mars. Pour corriger cela, vous devez regarder à la "fin du mois" comme étant une fenêtre allant de la dernière journée du mois de début jusqu'au dernier jour de la fin du mois inclus.

Qui mène à ce code. Je suis à l'aide d'une structure comme suit pour représenter une date:

{
  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
}

S'assurer que les données de cette structure représente une date valide est laissé comme exercice pour le lecteur.

Le code n'est pas très compliqué:

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

Le problème, c'est que vous êtes en soustrayant une chaîne de caractères à partir de la date. Vous avez besoin madate être la même type d'aujourd'hui.

mydate = new Date(userDate)

(Note: Ceci ne fonctionne qu'avec "mois/jour/année" format

2021-11-24 04:30:59

"Cela ne fonctionne qu'avec "mois/jour/année" format" n'est pas correct, intégré dans les analyseurs analyse (à tort ou à raison) une multitude de formats, souvent avec des résultats différents. Conseil général est "de ne pas utiliser l'analyseur intégré", manuellement l'analyse d/m/y n'est pas difficile.
RobG
-1

Si votre date est dans ce format (19/10/2021), vous pouvez d'abord les extraire.

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 vous voulez savoir si c'est par exemple, le 12 septembre et la prochaine date est le 12 octobre, Vous avez à considérer que septembre est de 30 jours. Vous devez vérifier à l'aide de 31/30/29/28-jour mois.


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()) est gravement erronée, il est effectivement Date.parse('2021,10,19') qui sera de retour NaN dans au moins une partie, si pas tous, les implémentations. Voir Pourquoi ne Date.analyser donner des résultats incorrects? et MDN: Date.l'analyser.
RobG

Dans d'autres langues

Cette page est dans d'autres langues

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