Dize biçiminde (JS)bir tarihten itibaren bir ay geçip geçmediğini denetleme

0

Soru

JavaScript uygulamamda, bunun gibi bir dize biçiminde bir tarih alıyorum: 19/10/2021 (gg/aa/yyyy). Söz konusu tarihten bu yana bir ay geçip geçmediğini kontrol etmek ve eğer öyleyse bir true değerini döndürmek istiyorum. Aşağıdaki kod gibi bir şey deniyorum ama çalışmıyor.

Konsol ile hata ayıklamayı denediğimde bazı garip değerler alıyorum.kayıtlar ve bunun gibi, js'de yeniyim, bu yüzden nerede yanlış şeyler yaptığımı bilmiyorum.

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

Şimdiden teşekkürler.

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

Bunu dene:

    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

İlk olarak, ayarladığınızda q -e doğru new Date() bugün. Gün, ay ve yılı alıp tekrar ayarlamanıza gerek yok. Yani bugün için sadece yapabilirsin var today = new Date().

Secound, Date()içine geçmelisiniz y,m,d ve değil d,m,y.

Üçüncü olarak, eğer başka bir tarih çıkarmak istiyorsanız, hesaplama milisecounds, gün yok olacak.

Bu çalışması gerekir :

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()) neredeyse kesinlikle geçersiz bir Tarih döndürür.
RobG

@ ROBG userDate dd/aa/yyyy biçiminde bir dizeyse, o zaman userDate.split('/').reverse() aşağıdaki gibi bir dizi döndürecek [yyyy,mm,dd]. ve Date() yapıcısının parametre olarak aldığı şey budur.
Mordy Stern

Tek bir değer, bir dizi iletiyorsunuz. ECMA-262'ye ve bu cevap hakkındaki yorumuma bakın.
RobG
0

Çünkü "aylardaki yaş" tanımıdır... esnek, en kolay yol, kafanızda hesaplayacağınız gibi küçük bir aritmetik kullanmaktır ve Date sınıf.

"Aylardaki yaş" ın [a] insan yorumu için kural şu şekildedir

  • İki tarih arasındaki farkı ay cinsinden hesaplayın, sanki ayın günü her iki tarih için de ayın 1'i gibi

  • Son ayı hariç tutmak için 1'i çıkarın

  • Ardından, dönemin son gününün ayın günü açıksa veya dönemin ilk gününün ayın gününden sonra [potansiyel olarak kısmi] son ayı tamamlanır: sayımı geri yüklemek için 1 ekleyin

Merhemdeki tek sinek, aylar farklı sayıda gün içerdiğinden, 2 ayın gün sayılarında farklılık gösterdiği durumlarla ilgilidir.

Bununla birlikte, bitiş ayı başlangıç ayından kısaysa, sınır koşulunun hiçbir zaman karşılanamayacağı bir duruma girebilirsiniz (örneğin, başlangıç tarihi 28 Şubat ve bitiş tarihi 31 Mart'tır. Bunu düzeltmek için," ayın sonu " na, başlangıç ayının son gününden bitiş ayının son gününe kadar değişen bir pencere olarak bakmanız gerekir.

Bu, bu koda yol açar. Bir tarihi temsil etmek için aşağıdaki gibi bir yapı kullanıyorum:

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

Bu yapıdaki verilerin geçerli bir tarihi temsil ettiğinden emin olmak, okuyucu için bir alıştırma olarak bırakılır.

Kod o kadar karmaşık değil:

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

Sorun, bir dizeyi tarihten çıkarmanızdır. Aynı olmak için randevuma ihtiyacın var. bugün olduğu gibi yazın.

mydate = new Date(userDate)

(Not: Bu yalnızca' ay/gün/yıl ' biçimiyle çalışır

2021-11-24 04:30:59

"Bu yalnızca 'ay/gün/yıl' biçimiyle çalışır " doğru değil, yerleşik ayrıştırıcılar genellikle farklı sonuçlarla çok sayıda biçimi (doğru veya başka şekilde) ayrıştırır. Genel tavsiye" yerleşik ayrıştırıcıyı kullanmayın " dır, d/m/y'yi manuel olarak ayrıştırmak zor değildir.
RobG
-1

Tarihiniz bu biçimdeyse (19/10/2021) önce bunları ayıklayabilirsiniz.

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

Örneğin, 12 Eylül olup olmadığını ve bir sonraki tarihin 12 Ekim olup olmadığını bilmek istiyorsanız, Eylül ayının 30 gün olduğunu düşünmelisiniz. 31/30/29/28 günlük aylara göre kontrol etmeniz gerekir.


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()) ciddi şekilde kusurlu, etkili bir şekilde Date.parse('2021,10,19') bu, Nan'i en azından bazılarında, hepsi olmasa da, uygulamalarda döndürecektir. Bakalım neden çıkıyor.ayrıştırma yanlış sonuçlar veriyor mu? ve MDN: Tarih.ayrıştırmak.
RobG

Diğer dillerde

Bu sayfa diğer dillerde

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