检查,如果一个月已经过去从一个日期在string format(JS)

0

的问题

在我JavaScript申我收到一个日期在一串的格式,这样的: 19/10/2021 (日/月/年). 我要检查,如果一个月以来已经过上述日期和返回的一个真实的,如果如此。 我想像下面这样的代码,但是它不工作。

我得到了一些怪异的价值观时,我尝试与控制台。日志,这样,我是个新手在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

第一,当你设置 qnew Date() 这是今天。 有没有需要得到从这一天、月和年,然后设置一次。 因此,对于今天你可以做到 var today = new Date().

秒,你应该通过进入日期() 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.split('/').reverse() 将返回阵喜欢 [yyyy,mm,dd]. 这是什么日期()构造是得到作为参数。
Mordy Stern

你传递一个单一的价值,一个阵列。 看到 通信机制详解-262 和我的评论在 这个答案.
RobG
0

因为定义的"年龄在几个月"是...是灵活的,最简单的方法是使用一个小小的运算你会算在你的头上,而不涉及 Date 类。

为的[一个]人的解释"的年龄在几个月",该规则是

  • 计算之间的差异的两个日期在几个月, 如果一天的月1日的每月两日

  • 减去1排除最后一个月

  • 然后,如果日的个月的 最后一 日期是上 或后天的月的 第一 天的期间内,[潜在的部分]最后一个月是完整的:增加1个恢复数

一只苍蝇在软膏是,由于个月,包含不同的天数,处理与的情况下2个月内有不同的天数。

然而,如果结束的月份是比较短的开始一个月,你可以得到进入的情况下的边界条件不能满足(例如,开始日期是二月28日和终止日期是三月31日。 为了解决这个问题,你需要看看在"结束的一个月"作为一个窗口的范围从最后一天开始的月份通过的最后一天结束的月份具有包容性。

导致这个代码。 我使用一个结构如下来表示一个日期:

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

确保数据在此结构表示有效的日期留下作为一个运动对于读者。

代码不是复杂的:

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

问题是,您是减去一串的日期。 你需要mydate是相同的 类的今天。

mydate = new Date(userDate)

(注:这只适用于'month/day/year'格式

2021-11-24 04:30:59

"这只适用于'month/day/year'格式"是不正确的,建立在分析程序将分析(正确或以其他方式)的多种格式,常常有不同的结果。 一般的建议是"不要使用内在分析器",手动解析d/m/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') 这将返回 中的至少一些,如果没有,实现。 看看 为什么日期。分析得到错误的结果? MDN:日期。分析.
RobG

其他语言

此页面有其他语言版本

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