【问题标题】:Calculate the date yesterday in JavaScript用 JavaScript 计算昨天的日期
【发布时间】:2011-07-27 13:09:15
【问题描述】:

如何在 JavaScript 中将 昨天 计算为日期?

【问题讨论】:

    标签: javascript date


    【解决方案1】:

    令人惊讶的是,最简单的跨浏览器解决方案没有答案

    要找到昨天完全相同的时间*:

    var yesterday = new Date(Date.now() - 86400000); // that is: 24 * 60 * 60 * 1000
    

    *:如果您的用例不介意日历怪异(如夏令时)的潜在不精确性,这很有效,否则我建议使用https://moment.github.io/luxon/

    【讨论】:

    • 夏令时更改时如何工作?这不会提前/落后一个小时吗?
    • 这不是一个正确的答案,因为并非所有的日子都持续 24 小时。在采用夏令时的国家/地区(例如所有欧洲和大部分北美地区),有一天持续 23 小时和一天持续 25 小时。
    • 别忘了闰秒。
    【解决方案2】:

    [edit 2020 年 9 月]:一个包含先前答案并添加了箭头函数的 sn-p

    // a (not very efficient) oneliner
    let yesterday = new Date(new Date().setDate(new Date().getDate()-1));
    console.log(yesterday);
    
    // a function call
    yesterday = ( function(){this.setDate(this.getDate()-1); return this} )
                .call(new Date);
    console.log(yesterday);
    
    // an iife (immediately invoked function expression)
    yesterday = function(d){ d.setDate(d.getDate()-1); return d}(new Date);
    console.log(yesterday);
    
    // oneliner using es6 arrow function
    yesterday = ( d => new Date(d.setDate(d.getDate()-1)) )(new Date);
    console.log(yesterday);
    
    // use a method
    const getYesterday = (dateOnly = false) => {
      let d = new Date();
      d.setDate(d.getDate() - 1);
      return dateOnly ? new Date(d.toDateString()) : d;
    };
    console.log(getYesterday());
    console.log(getYesterday(true));

    【讨论】:

    • 我宁愿避免弄乱范围:var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)
    • 如果你需要一个单行,使用类似 new Date( Date.now() - 24*60*60*1000 );这样做的好处是只创建一个 Date 对象。但老实说,维护这段代码的人会看到清晰的 2 行版本,而不是抛出函数(或毫秒,就此而言)。
    • 我真的很喜欢你这样做的方式。我已经有了我的解决方案,然后我看到了这个。我要改变我的昨天!我不得不稍微改变这个答案以添加括号以获取过去的代码验证器:const yesterday = (d => new Date(d.setDate(d.getDate()-1)).toISOString().split("T")[0])(new Date());,我只是抓住 YYYY-MM-DD(无需填充来获取我只是用作设置 max 属性的日期在此处使用 toISOString 输入日期)。
    【解决方案3】:

    排名第二的法比亚诺和其他一些人已经分享了类似的答案,但运行这个应该会让事情看起来更明显。

    86400000 = 一天中的毫秒数

    const event = new Date();
    console.log(new Date(Date.parse(event) - 86400000))
    console.log(event)

    【讨论】:

      【解决方案4】:

      我使用moment库,它非常灵活且易于使用。

      在你的情况下:

      let yesterday = moment().subtract(1, 'day').toDate();
      

      【讨论】:

      • 你最好用subtract而不是add
      • 工作也很好! ng FullCalendar 和他的 validRange 做得很好
      • 对于使用Dayjsdayjs().add(-1, 'day')的人
      【解决方案5】:

      解决边界日期问题 (2020, 01, 01) -> 2019, 12, 31

      var now = new Date();
      return new Date(now.getMonth() - 1 === 0 ? now.getFullYear() - 1 : now.getFullYear(),
                      now.getDate() - 1 === 0 ? now.getMonth() - 1: now.getMonth(),
                      now.getDate() - 1);
      

      【讨论】:

        【解决方案6】:

        这是一个单行,用于以文本格式 YYYY-MM-DD 获取昨天的日期并处理时区偏移。

        new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]
        

        它可以明显地更改为返回日期,x 天后的时间。包括时间等。

        console.log(Date())
        console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]); // "2019-11-11"
        console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('.')[0].replace('T',' ')); // "2019-11-11 11:11:11"
        
        // that is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000    // this is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000

        【讨论】:

          【解决方案7】:

          var today = new Date();
          var yesterday1 = new Date(new Date().setDate(new Date().getDate() - 1));
          var yesterday2 = new Date(Date.now() - 86400000);
          var yesterday3 = new Date(Date.now() - 1000*60*60*24);
          var yesterday4 = new Date((new Date()).valueOf() - 1000*60*60*24);
          console.log("Today: "+today);
          console.log("Yesterday: "+yesterday1);
          console.log("Yesterday: "+yesterday2);
          console.log("Yesterday: "+yesterday3);
          console.log("Yesterday: "+yesterday4);

          【讨论】:

          • 请记住,并非所有日子都持续 24 小时。在采用夏令时的国家(例如所有欧洲和大部分北美),有一天持续 23 小时和一天持续 25 小时。所以,只有这四个中的第一个实现可以解决这个问题。
          【解决方案8】:

          “Date.now() - 86400000”在夏令时结束日(当天有 25 小时)不起作用

          另一种选择是使用闭包:

          var d = new goog.date.Date();
          d.add(new goog.date.Interval(0, 0, -1));
          

          【讨论】:

            【解决方案9】:
            new Date(new Date().setDate(new Date().getDate()-1))
            

            【讨论】:

            • 你能补充一点解释吗?纯代码块本身并没有太大帮助
            • 工作正常!谢谢
            【解决方案10】:

            你可以使用momentjs,它对你可以用这个库实现很多事情很有帮助。

            用当前时间获取昨天的日期 moment().subtract(1, 'days').toString()

            获取具有日期开始的昨天日期 moment().subtract(1, 'days').startOf('day').toString()

            【讨论】:

              【解决方案11】:

              如果您想要获取昨天的日期并以人类可读的格式格式化该日期,请考虑创建一个自定义的 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 1 day
              // 3. Format it
              // 4. Output it
              // ---------------------------------------------------------------------
              document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -1));

              (另见this Fiddle

              【讨论】:

                【解决方案12】:

                试试这个,对我有用:

                var today = new Date();
                var yesterday = new Date(today.setDate(today.getDate() - 1)); `
                

                这让我得到了昨天的日期对象

                【讨论】:

                • 因为你使用的是today.setDate,所以今天也会变成昨天。最好创建昨天的变量然后设置它。 var yesterday = new Date(); yesterday.setDate(today.GetDate() - 1) 这样你今天和昨天都可以使用
                【解决方案13】:

                要概括问题并进行其他差异计算,请使用:

                var yesterday = new Date((new Date()).valueOf() - 1000*60*60*24);
                

                这将基于“now”的值创建一个新的日期对象,该值是一个整数,表示以毫秒为单位的 unix 纪元减去一天。

                两天前:

                var twoDaysAgo = new Date((new Date()).valueOf() - 1000*60*60*24*2);
                

                一小时前:

                var oneHourAgo = new Date((new Date()).valueOf() - 1000*60*60);
                

                【讨论】:

                • 这似乎是最安全的方法,因为我们在以毫秒表示的 unix 纪元上运行。所以算术比 getDate()-1 更安全。我没有尝试过 getDate()-1,但根据 getDate() 的文档,如果今天的日期是任何一个月的 1 日,它将返回 1。并且 1-1 = 0 不是有效日期。不确定 setDate(0) 将如何工作。
                • 这是我的方法,尽管您也可以稍微简化一下——尝试类似 new Date( Date.now() - 24*60*60*1000 );
                • setDate(0),顺便说一句,会很好——它会翻转到上个月的最后一天。但对我来说,在这里放弃毫秒表示似乎更整洁(也更直观) - 一个缺点是“一天中的毫秒数”并不那么明显,因此很容易输入错误的计算。
                • 使用 unix 时间似乎是更可靠的选择。这应该被评为更高。
                • @AmiHeines 在我看来,你永远不应该乘以 24。关于纯 Javascript,是的,date.setDate(date.getDate() + n) 始终有效,无需寻找其他东西。你只需要确保n 是一个整数。当然,在小时或分钟或秒之间存在差异的情况下,另一种方法是一种好方法。
                【解决方案14】:
                d.setHours(0,0,0,0);
                

                会成功的

                【讨论】:

                • 会吗?我以为这只是将您的小时、分钟和秒设置为 0,但实际上并没有更改日期?
                • 我必须使用负数才能到达昨天:d.setHours(-1,0,0,0)。这将返回昨天的日期,但可能不是您想要的时间 (23:00:00)
                【解决方案15】:

                这将在昨天 00:00 以分钟精度生成

                var d = new Date();
                d.setDate(d.getDate() - 1);
                d.setTime(d.getTime()-d.getHours()*3600*1000-d.getMinutes()*60*1000);
                

                【讨论】:

                  【解决方案16】:
                  //Create a date object using the current time
                  var now = new Date();
                  
                  //Subtract one day from it
                  now.setDate(now.getDate()-1);
                  

                  【讨论】:

                    【解决方案17】:
                    var date = new Date();
                    
                    date ; //# => Fri Apr 01 2011 11:14:50 GMT+0200 (CEST)
                    
                    date.setDate(date.getDate() - 1);
                    
                    date ; //# => Thu Mar 31 2011 11:14:50 GMT+0200 (CEST)
                    

                    【讨论】:

                    • 不错。乍一看,这似乎会失败,因为getDate 返回月份中的某天(例如:1 - 31),但实际上setDate(0) 将日期设置为上个月的最后一天。这是否适用于所有浏览器?
                    • 无法验证“所有”浏览器,但在我测试过的所有浏览器中都能正常工作camo.githubusercontent.com/…
                    • @Zargold 不明白你的意思。 node --version v9.4.0 node const date = new Date() undefined > date.toISOString() '2018-02-10T16:26:30.821Z' > date.setDate(date.getDate() - 1) 1518193590821 > date .toISOString() '2018-02-09T16:26:30.821Z'
                    • 嗯,是的,只是直接测试了它,你是对的,不知道我的用例有什么不同,并且已经完全重构了它。所以我将无法看到。
                    【解决方案18】:

                    试试这个

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

                    【讨论】:

                    • 下一个命令 d.setHours(19,59);将时间设置为晚上 7:59
                    猜你喜欢
                    • 2023-03-08
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-09-29
                    • 2015-04-23
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多