从另一个日期对象获取日期对象(提前六个月)

时间:2009-10-30 06:59:26

标签: javascript date

如何从另一个日期对象创建一个小于 n 月份的日期对象?我正在寻找类似DateAdd()的内容。

示例:

var objCurrentDate = new Date();

现在使用objCurrentDate,如何创建一个Date对象,其日期比今天的日期/ objCurrentDate早六个月?

4 个答案:

答案 0 :(得分:32)

您可以非常轻松地实现“addMonths”功能:

function addMonths(date, months) {
  date.setMonth(date.getMonth() + months);
  return date;
}


addMonths(new Date(), -6); // six months before now
// Thu Apr 30 2009 01:22:46 GMT-0600 

addMonths(new Date(), -12); // a year before now
// Thu Oct 30 2008 01:20:22 GMT-0600

答案 1 :(得分:1)

var oldDate:Date = new Date();
/*
 Check and adjust the date -
 At the least, make sure that the getDate() returns a 
 valid date for the calculated month and year.
 If it's not valid, change the date as per your needs.
 You might want to reset it to 1st day of the month/last day of the month
 or change the month and set it to 1st day of next month or whatever.
*/
if(oldDate.getMonth() < n)
    oldDate.setFullYear(oldDate.getFullYear() - 1);
oldDate.setMonth((oldDate.getMonth() + n) % 12);

答案 2 :(得分:0)

创建日期对象并传递n的值,其中n是月份的数字(加/减)。

  var dateObj = new Date();
  var requiredDate= dateObj.setMonth(dateObj.getMonth() - n);

答案 3 :(得分:0)

您必须要小心,因为日期有很多极端情况。例如,仅将月份改回6并不能说明每个月的天数不同。例如,如果您运行类似这样的函数:

function addMonths(date, months) {
date.setMonth((date.getMonth() + months) % 12);
return date;
}

addMonths(new Date(2020, 7, 31), -6); //months are 0 based so 7 = August

返回的最终日期是2020年2月31日。您需要考虑一个月中天数的差异。其他答案以各种方式建议了这一点,方法是将其移至月初,月末或下月初等。处理日期的另一种方法是保留日期(如果有效) ,或者将其移至月底的正常日期,则将其移至月底。您可以这样写:

function addMonths(date, months) {
  var month = (date.getMonth() + months) % 12;
  //create a new Date object that gets the last day of the desired month
  var last = new Date(date.getFullYear(), month + 1, 0);

  //compare dates and set appropriately
  if (date.getDate() <= last.getDate()) {
    date.setMonth(month);
  }

  else {
    date.setMonth(month, last.getDate());
  }

  return date;
}

这至少可以确保所选日期不会“溢出”要移动到的月份。 here记录了使用datePart = 0方法查找月份的最后一天。

此功能仍然有很多不足之处,因为它不会增加年份,并且您不能减去一年以上(否则您将遇到一个新问题,其中涉及负片)。但是,解决这些问题以及您可能遇到的其他问题(即时区)将留给读者练习。