【问题标题】:JavaScript calculating date from today date to 7 days beforeJavaScript 计算从今天日期到 7 天前的日期
【发布时间】:2013-11-11 15:38:37
【问题描述】:

我从今天开始计算日期前 12 天。但它不会返回正确的日期。 例如,对于今天 dat,11/11/2013 in (mm/dd/yyyy),它返回 10/30/2013,而它应该返回 10/31/2013。

这里是代码

var d = new Date();
d.setDate(d.getDate() - 12);
d.setMonth(d.getMonth() + 1 - 0);
var curr_date = d.getDate();
var curr_month = d.getMonth();
var curr_year = d.getFullYear();
if (curr_month < 10 && curr_date < 10) {
    var parsedDate = "0" + curr_month + "/" + "0" + curr_date + "/" + curr_year;
    alert(parsedDate);
} else if (curr_month < 10 && curr_date > 9) {
    var parsedDate = "0" + curr_month + "/" + curr_date + "/" + curr_year;
    alert(parsedDate);
} else if (curr_month > 9 && curr_date < 10) {
    var parsedDate = curr_month + "/" + "0" + curr_date + "/" + curr_year;
    alert(parsedDate);
} else {
    var parsedDate = curr_month + "/" + curr_date + "/" + curr_year;
    alert(parsedDate);
}

【问题讨论】:

  • 一句话:moment.js
  • 检查你的数学,12 天前是 10 月 30 日。
  • 不是你的问题的一部分,但你为什么要在 d.setMonth(d.getMonth() + 1 - 0); 中减去 0
  • 12 天前是 10 月 31 日
  • @ozil 我明白了,但是你减去 0 是没有意义的。这是相同的值。为什么不直接做d.setMonth(d.getMonth() + 1);

标签: javascript date


【解决方案1】:

问题解决了

var days; // Days you want to subtract
var date = new Date();
var last = new Date(date.getTime() - (days * 24 * 60 * 60 * 1000));
var day =last.getDate();
var month=last.getMonth()+1;
var year=last.getFullYear();

【讨论】:

    【解决方案2】:

    纯js一行解决方案:

    new Date(Date.now() - 7 * 24 * 60 * 60 * 1000)  // Tue Feb 04 2020 13:50:37 GMT...
    
    1. new Date() - 根据计算的毫秒时间创建 Date 对象。
    2. Date.now() - 从 1970 年开始以毫秒为单位给出时间。
    3. 7(天)* 24(小时)* 60(分钟)* 60(秒)* 1000 (毫秒) = 604800000 或 7 天,以毫秒为单位。

    如果您没有计划更改减去的值,您可以使用计算值,或者计算用于轻松更改减去的天数、分钟数等。


    如果您打算更频繁地处理日期和时间,我建议使用date-fnsdayjsdate-fns seems to be better

    const subDays = require('date-fns/subDays')
    subDays(new Date(), 7)
    

    附:为什么不是 moment.js? Moment.js 被认为是维护模式下的遗留项目。它没有死,但它确实完成了。见https://momentjs.com/docs/#/-project-status/

    【讨论】:

    • 如何选择上个月和本月?
    • @xetryDcoder 查看您的日期时间库的 api 文档
    【解决方案3】:

    您可以使用以下代码获取从今天日期到7天前的日期

    var date = new Date();
    date.setDate(date.getDate() - 7);
    
    var finalDate = date.getDate()+'/'+ (date.getMonth()+1) +'/'+date.getFullYear();
    

    【讨论】:

    • 我是唯一一个觉得 date.getMonth() 违反直觉的人会返回实际月份值的 -1 月份值吗?
    • 同意。但 date.getDay() 也是如此,所以这并不全是坏事。
    • 它返回实际月份的-1,以便您可以将其用作我认为的月份名称数组的索引
    【解决方案4】:

    尝试减去天数很棘手。最好从时间戳中减去并更改日期。

    减去 12 天:

       var d = new Date();
       var ts = d.getTime();
       var twelveDays = ts - (12 * 24 * 60 * 60 * 1000);
       d.setUTCDate(twelveDays);
    

    【讨论】:

    【解决方案5】:

    更新:)

    var timeFrom = (X) => {
        var dates = [];
        for (let I = 0; I < Math.abs(X); I++) {
            dates.push(new Date(new Date().getTime() - ((X >= 0 ? I : (I - I - I)) * 24 * 60 * 60 * 1000)).toLocaleString());
        }
        return dates;
    }
    console.log(timeFrom(-7)); // Future 7 Days
    console.log(timeFrom(7)); // Past 7 Days
    

    输出

    [
      '7/26/2019, 3:08:15 PM',
      '7/27/2019, 3:08:15 PM',
      '7/28/2019, 3:08:15 PM',
      '7/29/2019, 3:08:15 PM',
      '7/30/2019, 3:08:15 PM',
      '7/31/2019, 3:08:15 PM',
      '8/1/2019, 3:08:15 PM'
    ]
    [
      '7/26/2019, 3:08:15 PM',
      '7/25/2019, 3:08:15 PM',
      '7/24/2019, 3:08:15 PM',
      '7/23/2019, 3:08:15 PM',
      '7/22/2019, 3:08:15 PM',
      '7/21/2019, 3:08:15 PM',
      '7/20/2019, 3:08:15 PM'
    ]
    

    【讨论】:

      【解决方案6】:

      要获取过去几天的数组,请使用此代码

      查看控制台查看结果

      const GetDays = (d,Mention_today=false)=>{
      //Mention today mean the array will have today date 
      var DateArray = [];
      var days=d;
      for(var i=0;i<days;i++){
      if(!Mention_today && i==0){i=1;days+=1}
      var date = new Date();
      var last = new Date(date.getTime() - (i * 24 * 60 * 60 * 1000));
      var day =last.getDate();
      var month=last.getMonth()+1;
      var year=last.getFullYear();
      const fulld = (Number(year)+'-'+Number(month)+'-'+Number(day)) // Format date as you like
      DateArray.push(fulld);
      }
      return DateArray;
      }
      
      console.log(GetDays(5)) //Will get the past 5 days formated YY-mm-dd

      【讨论】:

        【解决方案7】:

        Date.prototype.addDays = function(days) {
            // Add days to given date
            var date = new Date(this.valueOf());
            date.setDate(date.getDate() + days);
            return date;
        }
        
        let today = new Date()
        
        console.log(today.addDays(-7))

        【讨论】:

          【解决方案8】:

          首先:获取当前日期

           const startingDate = new Date();
          

          第二:得到你想要的日期 !!: 如果你直接使用 setDate 改变startingDate,它会改变这个变量。

          const sevenDaysBeforeDate = new Date(new Date().setDate(new Date().getDate() - 7));
          

          7 天后

          const endDate = new Date(new Date().setDate(new Date().getDate() + 7));
          

          【讨论】:

            【解决方案9】:

            这是一个根据以下返回过去或未来日期的函数;

            If plusMinus = -1 then Past Date
            If plusMinus = 1 then Future Date
            
            function getDate(inDays, plusMinus) {
                const today = new Date(); 
                return new Date(today.getFullYear(),
                                today.getMonth(),
                                today.getDate() + (inDays * plusMinus));
            }
            

            【讨论】:

            • 这是不正确的,因为它将使用非法的 day 参数值(范围 [1..31]),并且在几个月甚至不到 31 个月内,ms 的技巧是唯一有效的一(奥兹尔)
            • 感谢您的反馈@rioV8 如果我正确理解了您的担忧,那么我想指出 Month 和 Date 本身是由 Date 对象确定的,例如 today.getMonth() 将遵循范围 [0-11 ] 因为它来自今天,它是一个日期对象。如果我错了,请纠正我。
            • 是的,但如果 getDate() 返回 1 并减去 5 天,则将新的日期参数设置为 -4,这是不允许的,会导致不确定的行为,并且取决于实现。
            • 我不认为这是正确的。如果您在控制台中运行以下代码,它将返回正确的值; new Date(today.getFullYear(), today.getMonth(), today.getDate() - 45);
            【解决方案10】:

            使用 dayjs 库,我们可以更轻松地做到这一点。

            import dayjs from 'dayjs';
            
            const getDate = (prevDays) => {
                const now = dayjs();
                console.log(now.subtract(prevDays, 'day').format('mm-dd-yyyy'));
                return now.subtract(prevDays, 'day').toDate();
            }
            

            【讨论】:

              【解决方案11】:

              这是最好的解决方案.. 当 X 是你的一天:

              var dates = [];
              for (let i = 0; i < X; i++) {
                var date = new Date();
              
                var thatDay = date.getDate() - i; //Current Date
                date.setDate(thatDay);
                let day = date.getDate();
                let month = date.getMonth() + 1;
                let year = date
                  .getFullYear()
                  .toString()
                  .substr(-2);
              
                dates.push(month + '/' + day + '/' + year); //format it as you need
              }
              //output mm/d/yy
              

              【讨论】:

                【解决方案12】:

                感谢您的帮助。我只是用了一个简单的函数,效果很好

                const subtractDayFromDate = (date, days) => {
                  const newDate = new Date(date);
                  newDate.setDate(newDate.getDate() - days);
                  return newDate;
                };
                
                

                【讨论】:

                • 与其他答案相比,这并不能真正回答原始问题,并且您没有解释为什么您的代码比接受的答案更有用。
                猜你喜欢
                • 1970-01-01
                • 2019-12-13
                • 1970-01-01
                • 1970-01-01
                • 2012-10-17
                • 1970-01-01
                • 1970-01-01
                • 2023-02-22
                • 2011-08-10
                相关资源
                最近更新 更多