กำลังตรวจสอบว่าเป็นเดือนผ่านจากเดทในรูปแบบข้อความ(JS)

0

คำถาม

ในของฉันจาวาสคริปต์โปรแกรมฉันได้รับวันที่ในรูปแบบข้อความเหมือนนี้: 19/10/2021 (dd/อืม/yyyy). ฉันอยากจะตรวจสอบว่าเป็นเดือนผ่านมาตั้งแต่บอกว่าวันและกลับมาเป็นเรื่องจริงถ้าอย่างนั้น ฉันพยายามบางอย่างเหมือนตามรหัสแต่มันไม่ทำงาน

ฉันกำลังจะประหลาดค่าตอนที่ฉันพยายามดีบั๊กโปรแกรมบนคอนโซล.ปูมบันทึกเรื่องฉันเป็น newbie ใน js ดังนั้นฉันไม่รู้ว่าฉันกำลังทำเรื่องผิดพลาด

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

ขอบคุณล่วงหน้า

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

พยายามนี้:

    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

ก่อนเมื่อคุณตั้งค่า q ต้อง new Date() มันเป็นวันนี้ มันไม่จำเป็นต้องจากมันวันที่เดือนและปีแล้วตั้งมันอีกครั้ง ดังนั้นสำหรับวันนี้คุณสามารถทำ var today = new Date().

Secound คุณควรจะผ่านเข้าไปในวันที่() y,m,d และไม่ใช่ d,m,y.

คนที่สามถ้าเธออลเดทจากอีกการคำนวณจะอยู่บน milisecounds ไม่ใช่วันนี้

นี่ควรจะทำงาน:

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()) เกือบมันใจกลับมาเป็นไม่ถูกต้องออกเดท
RobG

@RobG ถ้า userDate เป็นข้อความในรูปแบบ dd/อืม/yyyy แล้ว userDate.split('/').reverse() จะกลับมาเหมือนตารางคู่ลำดับ [yyyy,mm,dd]. และนี่คือสิ่งที่คน Date()constructor กำลังจะเป็นพารามิเตอร์
Mordy Stern

คุณกำลังส่งเดียวค่าเป็นอาเรย์. เห็น ECMA-262 และของฉันออกความเห็นเกี่ยวกับ เรื่องตอบ.
RobG
0

เพราะว่านิยามของ"อายุอยู่ในเดือน"คือ...เรื่องมากเกี่ยวมทางที่ง่ายที่สุดคือการใช้ดาวดวงเล็กน้อยรวมอัตโนมัติอย่างที่คุณจะสะทกสะทานเลยละสิมันอยู่ในความคิดของหล่อนและไม่เกี่ยวข้องกับที่พว Date ห้องเรียน

สำหรับค[ค]นมนุษย์ตีความแบบนั้นของ"อายุอยู่ในเดือน"ที่ออกกฏก็คือ

  • สะทกสะทานเลยละสิความแตกต่างระหว่างที่สองวันที่ในเดือน เหมือนว่าวันที่ของคนเดือนเป็นวันที่ 1 ของเดือนสำหรับทั้งสองวัน

  • ลบ 1 จากกลุ่มสุดท้ายเดือน

  • แล้วถ้าวันที่ของคนเดือนของคน เมื่อ วันในช่วงเวลาอยู่ หรือหลังจากวันที่ของคนเดือนของ ก่อน วันของช่วงเวลาที่[อาจจะแค่ส่วนนึงของ]สุดท้ายเดือนเป็นสมบูรณ์:เพิ่ม 1 เพื่อเรียกคืนนับได้

คนบินอยู่คนขี้ผึ้งมาทาเสียนะนี่ตั้งแต่เดือนมีต่างกันตัวเลขของวันก่อนการเกี่ยวข้องกับคดีก็ต่อเมื่อ 2 เดือนแตกต่างกันในของจำนวนของวันแล้ว

ถ้าอย่างไรก็ตามที่สิ้นสุดที่เดือนมันสั้นกว่ากเริ่มที่เดือน,คุณสามารถเข้าไปในสถานการณ์ที่ขอบเขตอาการไม่สามารถจะพบกัน(e.g. เริ่มเดทกันเป็นเดือนกุมภาพันธ์ 28th และวันสิ้นสุดคือเดือนมีนาควันที่ 31@item:inlistbox last day of the month. เพื่อแก้ไขที่คุณต้องดู"จุดจบของเดือน"จะเป็นหน้าต่าง ranging จากวันนี้เป็นวันสุดท้ายของเริ่มที่เดือนผ่านวันสุดท้ายของสิ้นสุดที่เดือนคิดถึงทุกฝ่า.

นั่นคือทางนี้เป็นรหัสมอส ฉันกำลังใช้โครงสร้างของชอบต่อไปนี้จะเป็นตัวแทนของวันที่:

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

Ensuring นข้อมูลในนั้น struct เป็นตัวแทนที่ใช้งานได้วันที่เหลือเป็นแบบฝึกหัดสำหรับเครื่องมืออ่าน.

รหัสไม่ใช่อย่างนั้นซับซ้อน:

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

ปัญหาก็คือว่าคุณเป็น subtracting เป็นข้อความจากเดทด้วย คุณต้องการ mydate ต้องเป็นคนเดียวกัน ประเภทที่วันนี้

mydate = new Date(userDate)

(ข้อควรจำ:นี่เดียวที่ทำงานกับ'เดือน/วัน/ปี'รูปแบบ

2021-11-24 04:30:59

"นี่เดียวที่ทำงานกับ'เดือน/วัน/ปี'รูปแบบ"ไม่ได้ถูกสร้างขึ้นใน parsers จะทำการวิเคราะห์(อย่างถูกต้องหรือไม่เช่นนั้น)เป็น multitude ของรูปแบบ,บ่อยครั้งกับ differing ผลลัพธ์เดียวกันนั่นแหละ ทั่วไปคำแนะนำก็คือ"อย่าใช้ที่รองรับอยู่ภายในตัวกระจายคำ",ด้วยตนเองกำลังวิเคราะห์ d/เอ็ม/y ไม่ใช่เรื่องยาก
RobG
-1

ถ้าเดทของคุณคือในรูปแบบ(19/10/2021)คุณสามารถก่อนคลายแฟ้มพวกเขา

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

ถ้าคุณอยากจะรู้ถ้ามันเป็นตัวอย่างเช่นที่ 12 วันแล้วต่อวันคือวันที่ 12 คุณต้องพิจารณาว่าเซฟเทมเบอคือ 30 วันก่อน คุณต้องเช็คจาก 31/30/29/28 วันเดือนแล้ว


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()) คือจริงจังมีชีวิตที่ยากลำบากเหมือนมันเป็นรถ Date.parse('2021,10,19') ซึ่งจะกลับ NaN ในอย่างน้อยก็บางคนถ้าไม่มีทั้งหมด implementations. เห็น ทำไมเดทด้วยการวิเคราะห์ไม่ถูกต้องให้ผลตรวจ? แล้ว MDN:ออกเดทการวิเคราะห์.
RobG

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่