Verificarea dacă a trecut o lună de la data în format șir(JS)

0

Problema

În JavaScript cerere am primit o dată într-un șir format, astfel: 19/10/2021 (zz/ll/aaaa). Vreau să verific dacă a trecut o lună de când data respectivă și să se întoarcă o adevărată dacă este așa. Am încercat ceva de genul următorul cod, dar nu este de lucru.

Primesc niste valori ciudate atunci când încerc depanare cu consola.jurnalele și astfel, eu sunt un newbie in js așa că nu știu de unde am de făcut ceva greșit.

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

Mulțumesc în avans.

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

Încercați acest lucru:

    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

În primul rând, atunci când setați q pentru a new Date() este astăzi. Nu este nevoie pentru a obține de la ea ziua, luna și anul și apoi setați-o din nou. Atât pentru astăzi, puteți face doar var today = new Date().

Secound, ar trebui să treacă în Data de() y,m,d și nu d,m,y.

Al treilea, dacă scazi o data de la un alt, calculul va fi pe milisecounds, nu zile.

Acest lucru ar trebui să funcționeze:

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()) aproape sigur se va întoarce un invalid Data.
RobG

@RobG dacă userDate este un șir de caractere în formatul dd/mm/yyyy, apoi userDate.split('/').reverse() va reveni matrice de genul [yyyy,mm,dd]. și aceasta este ceea ce Data() constructorul este obtinerea ca parametri.
Mordy Stern

Esti in trecere o singură valoare, o matrice. Vezi ECMA-262 și comentariul meu la acest răspuns.
RobG
0

Deoarece definiția de "vârsta în luni de zile" este... flexibil, cel mai simplu mod este de a utiliza un pic de aritmetica ca te-ar calcula în cap, și nu implică Date clasa.

Pentru [un] om interpretarea "vârsta în luni de zile", regula este

  • Calculează diferența dintre două date în luni, dacă ziua de luni a fost de 1 a lunii pentru ambele date

  • Scade 1 pentru a exclude ultima lună

  • Apoi, dacă a doua zi-de-pe-lună de la ultima zi a perioadei este pe sau după ziua de luni din prima zi a perioadei, [potențial parțială] ultima lună este completă: se adaugă 1 pentru a restabili conta

O muscă în unguent este, de luni conțin un număr diferit de zile, care se ocupă cu cazurile de 2 luni diferă în funcție de numărul de zile.

Dacă, cu toate acestea, la sfârșitul lună este mai scurtă decât la început de lună, puteți obține într-o situație în care starea limită nu pot fi atinse (de exemplu, data de începere este 28 februarie, iar data de finalizare este 31 Martie. Pentru a repara erorile de aceea, aveți nevoie să se uite la "sfârșitul lunii" ca fiind o fereastră de la ultima zi de start lună până în ultima zi de la sfârșitul lunii inclusiv.

Care duce la acest cod. Eu sunt, folosind o structură ca următoarele să reprezinte o data:

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

Asigurarea faptului că datele în care struct reprezintă o dată validă este lăsată ca exercițiu pentru cititor.

Codul nu este atât de complicat:

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

Problema este că sunt scăzând un șir de date. Ai nevoie de mydate să fie la fel tip ca și astăzi.

mydate = new Date(userDate)

(Notă: Aceasta funcționează numai cu lună/zi/an format

2021-11-24 04:30:59

"Acest lucru funcționează numai cu lună/zi/an formatul" nu este corect, built–in interpretoare va analiza (corect sau nu) o multitudine de formate, de multe ori, cu diferite rezultate. Sfatul General este "nu utilizați built–in parser", manual de analiză d/m/y, nu este dificil.
RobG
-1

Dacă data este în acest format (19/10/2021) trebuie mai întâi posibilitatea de a le extrage.

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

Dacă vrei să știi dacă e de exemplu, pe 12 septembrie, iar data viitoare este de 12 octombrie, trebuie să ia în considerare faptul că luna septembrie este de 30 de zile. Trebuie să verificați bazat pe 31/30/29/28-o zi de luni.


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()) este grav viciat, este eficient Date.parse('2021,10,19') care va reveni NaN în cel puțin unele, dacă nu toate, implementari. Vezi Ce Data.analiza da rezultate incorecte? și MDN: Data.analiza.
RobG

În alte limbi

Această pagină este în alte limbi

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