【问题标题】:Add 30 days to date (mm/dd/yy)迄今为止添加 30 天 (mm/dd/yy)
【发布时间】:2020-07-20 17:25:48
【问题描述】:

我有一个格式为 mm/dd/yy 的日期,并想在其上增加 30 天。我只是好奇最好的方法来做到这一点?我是 javascript 新手,所以示例会有所帮助。

已编辑

对不起,我使用的是美国日期格式mm/dd/yy

【问题讨论】:

    标签: javascript date


    【解决方案1】:

    更新答案(2018 年)

    将 30 天添加到日期字符串的一种方法是将其解析为日期,添加 30 天,然后将其格式化回字符串。

    应使用定制函数或库手动解析日期字符串。无论哪种方式,您都需要知道格式才能知道它是否被正确解析,例如

    // Given a string in m/d/y format, return a Date
    function parseMDY(s) {
      var b = s.split(/\D/);
      return new Date(b[2], b[0]-1, b[1]);
    }
    
    // Given a Date, return a string in m/d/y format
    function formatMDY(d) {
      function z(n){return (n<10?'0':'')+n}
      if (isNaN(+d)) return d.toString();
      return z(d.getMonth()+1) + '/' + z(d.getDate()) + '/' + d.getFullYear();
    }
    
    // Given a string in m/d/y format, return a string in the same format with n days added
    function addDays(s, days) {
      var d = parseMDY(s);
      d.setDate(d.getDate() + Number(days));
      return formatMDY(d);
    }
    
    [['6/30/2018', 30],
     ['1/30/2018', 30], // Goes from 30 Jan to 1 Mar
     ['12/31/2019', 30]].forEach(a => {
      console.log(`${a[0]} => ${addDays(...a)}`);
    });

    如果将“30 天”标准解释为添加一个月,那就有点棘手了。将 1 个月添加到 1 月 31 日将得到 2 月 31 日,根据该年的 2 月是 28 天还是 29 天,它会解析为 3 月 2 日或 3 日。解决该问题的一种算法是查看该月是否过时并将日期设置为上个月的最后一天,因此 2018-01-31 加上一个月会得到 2018-02-28。

    同样的算法适用于减去月份,例如

    /**
     * @param {Date} date - date to add months to
     * @param {number} months - months to add
     * @returns {Date}
    */
    function addMonths(date, months) {
    
      // Deal with invalid Date
      if (isNaN(+date)) return;
      
      months = parseInt(months);
    
      // Deal with months not being a number
      if (isNaN(months)) return;
    
      // Store date's current month
      var m = date.getMonth();
      date.setMonth(date.getMonth() + months);
      
      // Check new month, if rolled over an extra month, 
      // go back to last day of previous month
      if (date.getMonth() != (m + 12 + months)%12) {
        date.setDate(0);
      }
      
      // date is modified in place, but return for convenience
      return date;
    }
    
    // Helper to format the date as D-MMM-YYYY
    // using browser default language
    function formatDMMMY(date) {
      var month = date.toLocaleString(undefined,{month:'short'});
      return date.getDate() + '-' + month + '-' + date.getFullYear();
    }
    
    // Some tests
    [[new Date(2018,0,31),  1],
     [new Date(2017,11,31), 2],
     [new Date(2018,2,31), -1],
     [new Date(2018,6,31), -1],
     [new Date(2018,6,31), -17]].forEach(a => {
       let f = formatDMMMY;
       console.log(`${f(a[0])} plus ${a[1]} months: ${f(addMonths(...a))}`); 
    });

    当然,库可以帮助解决上述问题,算法是一样的。

    原始答案(现在非常过时)

    只需在今天的日期加上 30 天:

    var now = new Date();
    now.setDate(now.getDate() + 30);
    

    但是,这真的是你想做的吗?或者你想得到今天再加一个月?

    您可以使用以下方法将 d/m/y 日期转换为日期对象:

    var dString = '9/5/2011';
    var dParts = dString.split('/');
    var in30Days = new Date(dParts[2] + '/' +
                            dParts[1] + '/' +
                            (+dParts[0] + 30)
                   );
    

    对于美国日期格式,交换部分 0 和 1:

    var in30Days = new Date(dParts[2] + '/' +
                            dParts[0] + '/' +
                            (+dParts[1] + 30)
                   );
    

    但最好在将日期提供给函数之前将其转换为 ISO8601 格式,你真的不应该在同一个函数中混合日期解析和算术。一个全面的日期解析函数很复杂(不过分,但它们冗长乏味,需要大量测试),一旦有了日期对象,算术就很简单了。

    【讨论】:

    • 您需要做更多的工作才能使用问题中的非美国日期格式创建 Date 对象。
    • 不,我不知道。以上构建了一个 ISO8601 格式的日期字符串,ECMAScript Date 对象默认解析该字符串。原始文件中有一个与格式无关的小错误,但我从那以后就对其进行了编辑。 :-)
    • @RobG 我的意思是解析非美国日期字符串以设置初始 Date 对象时间(ed:看起来你明白我的意思);-)
    • @Jim 在这种情况下,只需将您的日期字符串传递给 Date 构造函数
    • @Phil - 你能举个例子吗
    【解决方案2】:

    完成它的一种简单方法是在Date 构造函数中发送时间戳值。以时间戳计算 30 天:

    30 * 24 * 60 * 60 * 1000

    那么,你需要当前的时间戳:

    Date.now()

    最后,将两个值相加并将结果作为参数发送到构造函数中:

    var nowPlus30Days = new Date(Date.now() + (30 * 24 * 60 * 60 * 1000));

    【讨论】:

    • var nowPlus30Days = new Date(Date.now() + 30*24*60*60*1000).toJSON().slice(0,10);
    • 这在夏令时范围内不能可靠地工作,因为并非所有的日子都是 24 小时长。使用date.setDate(date.getDate() + 30) 要好得多,打字也更少。 :-)
    【解决方案3】:

    试试

    new Date(+yourDate - 30 *86400000)
    

    var yourDate = new Date() 
    var newDate = new Date(+yourDate - 30 *86400000)
    
    console.log(newDate)

    【讨论】:

      【解决方案4】:

      反应答案

      某些 Javascript 命令在 React 中不可用,例如 getDate()。此外,我发现将日期更改为 Unix 时间戳会更好,这样我就可以使用简单的数学大于搜索在数据库搜索中更轻松地比较日期。

      const nowPlus30Days = new Date(Date.now() + (30 * 24 * 60 * 60 * 1000)).getTime() / 1000; 
      (1597829050.184)
      

      我可以把这个和今天比较一下:

      const today = new Date().getTime() / 1000 
      (1595237050.184)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        • 2022-11-19
        相关资源
        最近更新 更多