【问题标题】:How to subtract days from a plain Date?如何从普通日期中减去天数?
【发布时间】:2010-11-20 17:57:14
【问题描述】:

有没有一种简单的方法来获取 olain JavaScript Date(例如今天)并返回 X 天?

因此,例如,如果我想计算今天前 5 天的日期。

【问题讨论】:

    标签: javascript date


    【解决方案1】:

    试试这样的:

     var d = new Date();
     d.setDate(d.getDate()-5);
    

    注意,这会修改日期对象并返回更新日期的时间值。

    var d = new Date();
    
    document.write('Today is: ' + d.toLocaleString());
    
    d.setDate(d.getDate() - 5);
    
    document.write('<br>5 days ago was: ' + d.toLocaleString());

    【讨论】:

    • 它的输出给了我一长串整数。知道如何将其格式化为 2012 年 5 月 14 日吗?
    • 鉴于这是在谷歌的顶部,我想我会回答上面的评论:new Date(new Date().setDate(new Date().getDate()-5)) - 那将是 5 天前。在答案示​​例中,将其传递给新日期以获取日期对象。所以new Date(d) 就是你想要的。
    • 这样的问题是你可能会得到 00 这不是日期的有效值。
    • setDate(-1) 将日期设置为当月的最后一天
    • @user525146 询问如何格式化数字,而不是数字是什么。没有必要居高临下的回答。要格式化数字,请使用日期toString 方法之一,例如toISOStringtoDateString 等。
    【解决方案2】:

    它是这样的:

    var d = new Date(); // today!
    var x = 5; // go back 5 days!
    d.setDate(d.getDate() - x);
    

    【讨论】:

    • 它的输出给了我一长串整数。知道如何将其格式化为 2012 年 5 月 14 日吗?
    • d.setDate的返回值确实是一个整数值。但是,此时您可能对返回值实际上并不感兴趣,因为“d”的实际值已被修改。您现在真正的问题是如何格式化您的日期,它现在在“d”中,而不是 setDate 的返回值。 (嗯,它实际上是返回值,但它不是那个时候的日期,我不想让你感到困惑——只需使用 d,它会更快)。对于格式化日期,您需要 d.getMonth()、d.getFullYear() 和 d.getDate() 方法。你想给 d.getMonth() 加一个,因为 Jan 是 0。
    • 作为一个简单的方法:function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a}; 然后只是var daysAgo45 = getDaysAgo(45);
    • @MiroKrsjak 当然,如果您跨过月末/月初,这将有效。为什么它不起作用?
    【解决方案3】:
    var dateOffset = (24*60*60*1000) * 5; //5 days
    var myDate = new Date();
    myDate.setTime(myDate.getTime() - dateOffset);
    

    如果您在整个 Web 应用程序中执行大量令人头疼的日期操作,DateJS 会让您的生活更轻松:

    http://simonwillison.net/2007/Dec/3/datejs/

    【讨论】:

    • 这是一个边缘情况,但这可能会在夏令时开始/结束时失败。你不是减去 5 天,而是 5*24 小时。夏令时的第一天只有23小时,最后一天是25小时。这通常无关紧要,但需要考虑。
    • @Kip 我讨厌夏令时......和时区。我们都应该搬到格林威治标准时间。
    • @cwallenpoole 不要让你的泡沫破灭,但他们甚至在格林威治也使用 DST。因此,如果您真的想使用 GMT,那么您仅限于冰岛和一些西非国家。
    • 这种方法的问题是它不适用于新年等。
    • @danielWilliams 这在新的一年里怎么不起作用? getTime()setTime() 是自纪元以来的毫秒数。如果时间跨过一年的界限,这无关紧要。
    【解决方案4】:

    将您的日期分成几部分,然后返回一个带有调整值的新日期

    function DateAdd(date, type, amount){
        var y = date.getFullYear(),
            m = date.getMonth(),
            d = date.getDate();
        if(type === 'y'){
            y += amount;
        };
        if(type === 'm'){
            m += amount;
        };
        if(type === 'd'){
            d += amount;
        };
        return new Date(y, m, d);
    }
    

    请记住,月份是从零开始的,但日子不是。即 new Date(2009, 1, 1) == 2009 年 2 月 1 日,new Date(2009, 1, 0) == 2009 年 1 月 31 日;

    【讨论】:

    • 如果您以这种方式将例如 50 天添加到日期会发生什么?它会将日期定为 2009 年 8 月 68 日吗?或者你确定这总是正确地结束到适当的月份和/或年份?
    • 使用它来添加 addDays、addMonths 和 addYears 到 Date.prototype。漂亮而简单。
    • 这应该是正确的答案 - 即使在一年中的最后一天,当接受的答案失败时,它也可以工作。
    • 不适用于年份从 1 到 99 的日期。;-) 最好只使用 get*set* 方法.
    【解决方案5】:

    我为 Date 制作了这个原型,以便我可以传递负值来减去天数,传递正值来增加天数。

    if(!Date.prototype.adjustDate){
        Date.prototype.adjustDate = function(days){
            var date;
    
            days = days || 0;
    
            if(days === 0){
                date = new Date( this.getTime() );
            } else if(days > 0) {
                date = new Date( this.getTime() );
    
                date.setDate(date.getDate() + days);
            } else {
                date = new Date(
                    this.getFullYear(),
                    this.getMonth(),
                    this.getDate() - Math.abs(days),
                    this.getHours(),
                    this.getMinutes(),
                    this.getSeconds(),
                    this.getMilliseconds()
                );
            }
    
            this.setTime(date.getTime());
    
            return this;
        };
    }
    

    所以,要使用它,我可以简单地写:

    var date_subtract = new Date().adjustDate(-4),
        date_add = new Date().adjustDate(4);
    

    【讨论】:

    • 您可以将d.setDate(d.getDate() + days)days 的正值和负值一起使用来分别加减天数。它应该在实例上工作(就像其他 Date 方法一样),而不是创建和返回副本。
    【解决方案6】:
    var my date = new Date().toISOString().substring(0, 10);
    

    它只能给你像 2014-06-20 这样的日期。 希望会有所帮助

    【讨论】:

    • OP 要求减去 X 天在哪里?
    【解决方案7】:

    我注意到 getDays+ X 不能在日/月的范围内工作。只要您的日期不在 1970 年之前,就可以使用 getTime。

    var todayDate = new Date(), weekDate = new Date();
    weekDate.setTime(todayDate.getTime()-(7*24*3600000));
    

    【讨论】:

    • 我也注意到了。我很惊讶没有,还是我错过了什么?
    • 这是不正确的,new Date().setDate(-1) 会给你上个月的最后一天。
    • 这在夏令时开始/结束的边缘情况下也是不正确的。假设每天有 24 小时,您的方法是减去 7*24 小时。 DST 的第一天只有 23 小时,最后一天是 25 小时。 setDate(getDate()-7) 没有这个问题。
    • getTime 适用于通用时间。因此将从 Date 对象中正确减去 7 天的时间。当您将其转换为指定时区的字符串时,它将正确显示该时区的时间。
    • 时间变更日要小心。当我们在秋天倒退时,那一天有 25 小时,所以从午夜减去 24 小时将使您在同一天降落。但是,如果您将每次操作后的第二天四舍五入到最近的午夜,这种技术(减去毫秒)将起作用。您可以先添加 12 小时,然后将小时数设置为零。
    【解决方案8】:
    var daysToSubtract = 3;
    $.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;
    

    【讨论】:

      【解决方案9】:

      我喜欢在毫秒内完成数学运算。所以使用Date.now()

      var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds
      

      如果你喜欢它的格式

      new Date(newDate).toString(); // or .toUTCString or .toISOString ...
      

      注意:Date.now() 在旧版浏览器中不起作用(例如,我认为是 IE8)。 Polyfill here.

      2015 年 6 月更新

      @socketpair 指出了我的草率。正如她/他所说:“一年中的某天有 23 小时,而由于时区规则,有 25 小时”。

      为了对此进行扩展,如果您想在夏令时更改的时区中计算 5 天前的 LOCAL 日,并且您

      • 假设(错误地)Date.now() 为您提供当前 LOCAL 现在时间,或者
      • 使用.toString(),它返回本地日期,因此与UTC 中的Date.now() 基准日期不兼容。

      但是,如果您在 UTC 中进行数学运算,例如

      A.您想要从现在 (UTC) 算起 5 天前的 UTC 日期

      var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTC
      new Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString
      

      B.您从“现在”以外的 UTC 基准​​日期开始,使用 Date.UTC()

      newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;
      new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString
      

      【讨论】:

      • 这并不准确。一年中的某天有 23 小时,而由于时区规则,有 25 小时。
      • 当有闰秒时我会担心失败情况......所以可能对关键代码不利。
      【解决方案10】:

      一些现有的解决方案很接近,但并不完全符合我的要求。此函数适用于正值或负值并处理边界情况。

      function addDays(date, days) {
          return new Date(
              date.getFullYear(),
              date.getMonth(),
              date.getDate() + days,
              date.getHours(),
              date.getMinutes(),
              date.getSeconds(),
              date.getMilliseconds()
          );
      }
      

      【讨论】:

      • 如果我使用此方法将 20 天添加到当月 15 日,它是否会“溢出”到下个月?好像没有。
      • @Bora - 是的,如有必要,它会正确增加月份。例如,将 20 天添加到 8 月 15 日: addDays(new Date(2015, 07, 15), 20) 将返回“Fri Sep 04 2015 00:00:00 GMT-0700 (PDT)”
      【解决方案11】:

      设置日期时,日期转换为毫秒,所以需要将其转换回日期:

      此方法还考虑到新年变化等。

      function addDays( date, days ) {
          var dateInMs = date.setDate(date.getDate() - days);
          return new Date(dateInMs);
      }
      
      var date_from = new Date();
      var date_to = addDays( new Date(), parseInt(days) );
      

      【讨论】:

        【解决方案12】:

        获取 moment.js。所有酷的孩子都使用它。它有更多的格式化选项等。在哪里

        var n = 5;
        var dateMnsFive = moment(<your date>).subtract(n , 'day');
        

        可选!转换为 JS Date obj 以进行 Angular 绑定。

        var date = new Date(dateMnsFive.toISOString());
        

        可选!格式

        var date = dateMnsFive.format("YYYY-MM-DD");
        

        【讨论】:

        • 通过将您的日期传递到时刻,您将开始收到警告。弃用警告:提供的值不是可识别的 RFC2822 或 ISO 格式。 moment 构造回退到 js Date(),这在所有浏览器和版本中并不可靠。不鼓励使用非 RFC2822/ISO 日期格式,并将在即将发布的主要版本中删除。更多信息请参考momentjs.com/guides/#/warnings/js-date
        【解决方案13】:

        您可以使用 Javascript。

        var CurrDate = new Date(); // Current Date
        var numberOfDays = 5;
        var days = CurrDate.setDate(CurrDate.getDate() + numberOfDays);
        alert(days); // It will print 5 days before today
        

        对于 PHP,

        $date =  date('Y-m-d', strtotime("-5 days")); // it shows 5 days before today.
        echo $date;
        

        希望对你有帮助。

        【讨论】:

          【解决方案14】:

          最佳答案导致了我的代码中的一个错误,即在本月的第一天,它将在当前月份设置未来日期。这就是我所做的,

          curDate = new Date(); // Took current date as an example
          prvDate = new Date(0); // Date set to epoch 0
          prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time
          

          【讨论】:

            【解决方案15】:

            管理日期的简单方法是使用Moment.js

            您可以使用add。示例

            var startdate = "20.03.2014";
            var new_date = moment(startdate, "DD.MM.YYYY");
            new_date.add(5, 'days'); //Add 5 days to start date
            alert(new_date);
            

            文档http://momentjs.com/docs/#/manipulating/add/

            【讨论】:

              【解决方案16】:

              var d = new Date();
              
              document.write('Today is: ' + d.toLocaleString());
              
              d.setDate(d.getDate() - 31);
              
              document.write('<br>5 days ago was: ' + d.toLocaleString());

              【讨论】:

                【解决方案17】:

                我发现 getDate()/setDate() 方法的一个问题是它太容易将所有内容都转换为毫秒,而且有时我很难理解语法。

                相反,我喜欢解决 1 天 = 86,400,000 毫秒这一事实。

                所以,对于您的特定问题:

                today = new Date()
                days = 86400000 //number of milliseconds in a day
                fiveDaysAgo = new Date(today - (5*days))
                

                像魅力一样工作。

                我一直使用这种方法进行 30/60/365 天滚动计算。

                你可以很容易地推断出这个来创建月、年等的时间单位。

                【讨论】:

                • 如果使用 TypeScript,这需要是 new Date(today.getTime() - (5*days))
                • 如果代码在凌晨 2 点附近运行并且夏令时在过去 5 天内发生了变化,这可能会给出不正确的结果。
                【解决方案18】:

                对我来说,所有组合都适用于以下代码片段, sn-p 用于 Angular-2 实现, 如果你需要增加天数,传递正数的天数,如果你需要减去,传递负数的天数

                function addSubstractDays(date: Date, numberofDays: number): Date {
                let d = new Date(date);
                return new Date(
                    d.getFullYear(),
                    d.getMonth(),
                    (d.getDate() + numberofDays)
                );
                }
                

                【讨论】:

                  【解决方案19】:

                  我喜欢以下内容,因为它是一行。 DST 更改并不完美,但通常足以满足我的需求。

                  var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5));
                  

                  【讨论】:

                    【解决方案20】:

                    function addDays (date, daysToAdd) {
                      var _24HoursInMilliseconds = 86400000;
                      return new Date(date.getTime() + daysToAdd * _24HoursInMilliseconds);
                    };
                    
                    var now = new Date();
                    
                    var yesterday = addDays(now, - 1);
                    
                    var tomorrow = addDays(now, 1);

                    【讨论】:

                      【解决方案21】:

                      不使用第二个变量,您可以将 7 替换为您的 x 天:

                      let d=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))
                      

                      【讨论】:

                      • 我在另一个条目上对此发表了评论,但这里也适用:由于时间调整,并非所有天都是 86.4m 毫秒。这可能会使结果失真 +/- 1 天
                      【解决方案22】:

                      我在 date.js 中获得了不错的成绩:

                      http://www.datejs.com/

                      d = new Date();
                      d.add(-10).days();  // subtract 10 days
                      

                      不错!

                      网站包含这种美丽:

                      Datejs 不只是解析字符串,它会将它们干净地分成两部分

                      【讨论】:

                        【解决方案23】:

                        我转换成毫秒并扣除天数,否则月份和年份不会改变且符合逻辑

                        var numberOfDays = 10;//number of days need to deducted or added
                        var date = "01-01-2018"// date need to change
                        var dt = new Date(parseInt(date.substring(6), 10),        // Year
                                      parseInt(date.substring(3,5), 10) - 1, // Month (0-11)
                                      parseInt(date.substring(0,2), 10));
                        var new_dt = dt.setMilliseconds(dt.getMilliseconds() - numberOfDays*24*60*60*1000);
                        new_dt = new Date(new_dt);
                        var changed_date = new_dt.getDate()+"-"+(new_dt.getMonth()+1)+"-"+new_dt.getFullYear();
                        

                        希望有帮助

                        【讨论】:

                          【解决方案24】:

                          如果您想减去天数并以人类可读的格式格式化您的日期,您应该考虑创建一个自定义的 DateHelper 对象,看起来像这样:

                          var DateHelper = {
                              addDays : function(aDate, numberOfDays) {
                                  aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
                                  return aDate;                                  // Return the date
                              },
                              format : function format(date) {
                                  return [
                                     ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
                                     ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
                                     date.getFullYear()                          // Get full year
                                  ].join('/');                                   // Glue the pieces together
                              }
                          }
                          
                          // With this helper, you can now just use one line of readable code to :
                          // ---------------------------------------------------------------------
                          // 1. Get the current date
                          // 2. Subtract 5 days
                          // 3. Format it
                          // 4. Output it
                          // ---------------------------------------------------------------------
                          document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -5));

                          (另见this Fiddle

                          【讨论】:

                            【解决方案25】:

                            我创建了一个日期操作函数。您可以添加或减去任意天数、小时数、分钟数。

                            function dateManipulation(date, days, hrs, mins, operator) {
                               date = new Date(date);
                               if (operator == "-") {
                                  var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
                                  var newDate = new Date(date.getTime() - durationInMs);
                               } else {
                                  var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
                                  var newDate = new Date(date.getTime() + durationInMs);
                               }
                               return newDate;
                             }
                            

                            现在,通过传递参数来调用这个函数。例如,这里有一个函数调用,用于获取从今天起 3 天之前的日期。

                            var today = new Date();
                            var newDate = dateManipulation(today, 3, 0, 0, "-");
                            

                            【讨论】:

                              【解决方案26】:

                              var date = new Date();
                              var day = date.getDate();
                              var mnth = date.getMonth() + 1;
                              
                              var fDate = day + '/' + mnth + '/' + date.getFullYear();
                              document.write('Today is: ' + fDate);
                              var subDate = date.setDate(date.getDate() - 1);
                              var todate = new Date(subDate);
                              var today = todate.getDate();
                              var tomnth = todate.getMonth() + 1;
                              var endDate = today + '/' + tomnth + '/' + todate.getFullYear();
                              document.write('<br>1 days ago was: ' + endDate );

                              【讨论】:

                              • 你应该总是评论你的代码/答案,因为有些人可能不明白你在做什么
                              【解决方案27】:

                              使用 MomentJS

                              function getXDaysBeforeDate(referenceDate, x) {
                                return moment(referenceDate).subtract(x , 'day').format('MMMM Do YYYY, h:mm:ss a');
                              }
                              
                              var yourDate = new Date(); // let's say today
                              var valueOfX = 7; // let's say 7 days before
                              
                              console.log(getXDaysBeforeDate(yourDate, valueOfX));
                              &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"&gt;&lt;/script&gt;

                              【讨论】:

                                【解决方案28】:

                                使用现代 JavaScript 函数语法

                                const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));
                                
                                console.log(getDaysPastDate(1)); // yesterday

                                【讨论】:

                                  【解决方案29】:

                                  试试这样的

                                  dateLimit = (curDate, limit) => {
                                      offset  = curDate.getDate() + limit
                                      return new Date( curDate.setDate( offset) )
                                  }
                                  

                                  currDate 可以是任何日期

                                  limit 可能是天数的差异(未来为正数,过去为负数)

                                  【讨论】:

                                    【解决方案30】:

                                    这将为您提供过去 10 天的结果 110% 工作您不会遇到任何类型的问题

                                    var date = new Date();
                                    var day=date.getDate();
                                    var month=date.getMonth() + 1;
                                    var year=date.getFullYear();
                                    var startDate=day+"/"+month+"/"+year;
                                    var dayBeforeNineDays=moment().subtract(10, 'days').format('DD/MM/YYYY');
                                    startDate=dayBeforeNineDays;
                                    var endDate=day+"/"+month+"/"+year;
                                    

                                    您可以根据您的要求更改减去天数

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2010-10-01
                                      • 2012-10-07
                                      • 1970-01-01
                                      • 2018-04-09
                                      • 1970-01-01
                                      • 2013-02-03
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多