如何在今天前三个月用JavaScript计算日期?

时间:2011-10-29 05:44:22

标签: javascript date

我正在尝试在当前日期之前3个月形成一个日期。我通过以下代码获得当前月份

var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;

考虑到月份是1月(1),日期前3个月将是OCtober(10),你能为我提供计算和形成日期(Date数据类型的对象)的逻辑吗? ?

17 个答案:

答案 0 :(得分:256)

var d = new Date();
d.setMonth(d.getMonth() - 3);

这适用于1月份。运行此代码段:

var d = new Date("2012/01/14");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());

答案 1 :(得分:21)

我建议使用名为Moment.js的库。

经过充分测试,跨浏览器和服务器端工作(我在Angular和Node项目中都使用它)。它对语言环境日期有很大的支持。

http://momentjs.com/

var threeMonthsAgo = moment().subtract(3, 'months');

console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00

.format()返回以ISO 8601格式格式化的日期的字符串表示形式。您也可以使用自定义日期格式,如下所示:.format('dddd, MMMM Do YYYY, h:mm:ss a')

答案 2 :(得分:7)

这应该处理加法/减法,只需将一个负值放入减去,然后加一个正值。这也解决了月交叉问题。

function monthAdd(date, month) {
    var temp = date;
    temp = new Date(date.getFullYear(), date.getMonth(), 1);
    temp.setMonth(temp.getMonth() + (month + 1));
    temp.setDate(temp.getDate() - 1); 

    if (date.getDate() < temp.getDate()) { 
        temp.setDate(date.getDate()); 
    }

    return temp;    
}

答案 3 :(得分:7)

为了使事情变得非常简单,您可以使用DateJS,一个JavaScript的日期库:

http://www.datejs.com/

您的示例代码:

Date.today().add({ months: -1 });

答案 4 :(得分:5)

将“一个班轮”(在许多行上便于阅读))直接放入变量:

var oneMonthAgo = new Date(
    new Date().getFullYear(),
    new Date().getMonth() - 1, 
    new Date().getDate()
);

答案 5 :(得分:3)

如果gilly3提供的setMonth方法不是您想要的,请考虑:

var someDate = new Date(); // add arguments as needed
someDate.setTime(someDate.getTime() - 3*28*24*60*60);
// assumes the definition of "one month" to be "four weeks".

可以使用任何时间,只需设置正确的倍数。

答案 6 :(得分:3)

我喜欢gilly3's answer的简单性,但是用户可能会惊讶于3月31日前的一个月是3月3日。我选择实施一个坚持到月底的版本,所以在3月之前的一个月28,29,30和31都将是2月28日,当时它不是闰年。

&#13;
&#13;
function addMonths(date, months) {
  var result = new Date(date),
      expectedMonth = ((date.getMonth() + months) % 12 + 12) % 12;
  result.setMonth(result.getMonth() + months);
  if (result.getMonth() !== expectedMonth) {
    result.setDate(0);
  }
  return result;
}

var dt2004_05_31 = new Date("2004-05-31 0:00"),
    dt2001_05_31 = new Date("2001-05-31 0:00"),
    dt2001_03_31 = new Date("2001-03-31 0:00"),
    dt2001_02_28 = new Date("2001-02-28 0:00"),
    result = addMonths(dt2001_05_31, -2);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, -3);
console.assert(dt2001_02_28.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, 36);
console.assert(dt2004_05_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2004_05_31, -38);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

console.log('Done.');
&#13;
&#13;
&#13;

答案 7 :(得分:1)

由于我似乎没有看到它的建议。...

const d = new Date();
const day = d.getDate();
const goBack = 3;
for (let i = 0; i < goBack; i++) d.setDate(0);
d.setDate(day);

这将为您提供3个月前的今天的日期,因为.setDate(0)将日期设置为上个月的最后一天,而不管一个月包含多少天。 day用于恢复今天的日期值。

答案 8 :(得分:1)

public function render($request, Exception $e)
{
    if ( $e instanceof \Illuminate\Database\QueryException ) {
        // show custom view
        //Or
        dump($e->errorInfo);
    } 
   return parent::render($request, $exception);
}

答案 9 :(得分:1)

已经有一个优雅的答案,但我发现它难以阅读所以我自己的功能。出于我的目的,我不需要否定结果,但修改起来并不困难。

    var subtractMonths = function (date1,date2) {
        if (date1-date2 <=0) {
            return 0;
        }
        var monthCount = 0;
        while (date1 > date2){
            monthCount++;
            date1.setMonth(date1.getMonth() -1);
        }
        return monthCount;
    }

答案 10 :(得分:0)

   var minDate = new Date(); 
   minDate.setMonth(minDate.getMonth() - 3);

声明具有当前日期的变量。 然后只需使用setMonth内置函数,我们就能获得3个月的追溯日期。

答案 11 :(得分:0)

执行此操作

 let currentdate = new Date();
 let last3months = new Date(currentdate.setMonth(currentdate.getMonth()-3));

JavaScript的setMonth方法也很适合这一年。例如,如果将currentDate设置为2020-01-29

,上述代码将返回new Date("2020-01-29")

答案 12 :(得分:-1)

在我的情况下,我需要将1个月减去当前日期。重要的部分是月份编号,因此它并不关心您当月的哪一天,我上个月需要。这是我的代码:

var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)

减去1个月到实际日期它不准确,这就是为什么我首先设置月份的第一天(任何一个月的第一天总是第一天),在第二个地方我减去1天,总是送你到上个月。 希望能帮到你。

&#13;
&#13;
var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)
&#13;
&#13;
&#13;

答案 13 :(得分:-1)

&#13;
&#13;
   

 var date=document.getElementById("date");
    var d = new Date();
   document.write(d + "<br/>");
    d.setMonth(d.getMonth() - 6);
    document.write(d);

 if(d<date)
  document.write("lesser then 6 months");
else
  document.write("greater then 6 months");
&#13;
&#13;
&#13;

答案 14 :(得分:-1)

传递一个JS Date对象和一个要添加/减去多少个月的整数。 monthsToAdd可以是正数或负数。返回JS日期对象。

如果您的originalDateObject是3月31日,并且您以-1表示monthsToAdd,那么您的输出日期将是2月28日。

如果您经过大量的月份(例如36),它也会正确处理年份调整。

const addMonthsToDate = (originalDateObject, monthsToAdd) => {
  const originalDay = originalDateObject.getUTCDate();
  const originalMonth = originalDateObject.getUTCMonth();
  const originalYear = originalDateObject.getUTCFullYear();

  const monthDayCountMap = {
    "0": 31,
    "1": 28,
    "2": 31,
    "3": 30,
    "4": 31,
    "5": 30,
    "6": 31,
    "7": 31,
    "8": 30,
    "9": 31,
    "10": 30,
    "11": 31
  };

  let newMonth;
  if (newMonth > -1) {
    newMonth = (((originalMonth + monthsToAdd) % 12)).toString();
  } else {
    const delta = (monthsToAdd * -1) % 12;
    newMonth = originalMonth - delta < 0 ? (12+originalMonth) - delta : originalMonth - delta;
  }

  let newDay;

  if (originalDay > monthDayCountMap[newMonth]) {
    newDay = monthDayCountMap[newMonth].toString();
  } else {
    newDay = originalDay.toString();
  }

  newMonth = (+newMonth + 1).toString();

  if (newMonth.length === 1) {
    newMonth = '0' + newMonth;
  }

  if (newDay.length === 1) {
    newDay = '0' + newDay;
  }

  if (monthsToAdd <= 0) {
    monthsToAdd -= 11;
  }

  let newYear = (~~((originalMonth + monthsToAdd) / 12)) + originalYear;

  let newTime = originalDateObject.toISOString().slice(10, 24);

  const newDateISOString = `${newYear}-${newMonth}-${newDay}${newTime}`;

  return new Date(newDateISOString);
};

答案 15 :(得分:-3)

Following code give me Just Previous Month From Current Month even the date is 31/30 of current date and last month is 30/29/28 days:

   <!DOCTYPE html>
<html>
<body>

<p>Click the button to display the date after changing the month.</p>

<button onclick="myFunction()">Try it</button>

<p id="demo"></p>

<script>
function myFunction() {

var d = new Date("March 29, 2017"); // Please Try the result also for "March 31, 2017" Or "March 30, 2017"
var OneMonthBefore =new Date(d);

OneMonthBefore.setMonth(d.getMonth(),0);
if(OneMonthBefore.getDate() < d.getDate()  )
{
d.setMonth(d.getMonth(),0);
}else
{
d.setMonth(d.getMonth()-1);

}

    document.getElementById("demo").innerHTML = d;
}
</script>

</body>
</html>

答案 16 :(得分:-4)

&#13;
&#13;
var d = new Date();
document.write(d + "<br/>");
d.setMonth(d.getMonth() - 6);
document.write(d);
&#13;
&#13;
&#13;