How to calculated 3 months date based on given date JavaScript

时间:2016-10-20 12:47:30

标签: javascript date

function change()    {
    var date    =     new Date();
    var dd = date.getDate("startDate");
    var mm = date.getMonth("startDate")+1;
    var yyyy = date.getFullYear("startDate");
    var myDate=yyyy+'-'+mm+'-'+dd;
    
    var tmps = new Date(myDate).getTime();
    var newdate = (90*3600*24*1000)+tmps;
    var t=new Date(newdate);
    var dd= t.getDate();
    var mm=t.getMonth()+1;
    var yyyy=t.getFullYear();
    var tdate=yyyy+'-'+mm+'-'+dd;
    // alert(document.getElementById("endDate").value=tdate);
    return tdate;
}
document.write(change());

My problem is that the tdate value actually gives a YYYY-M-DD value, instead of a YYYY-DD-MM.

3 个答案:

答案 0 :(得分:1)

有一个名为Moment的JavaScript时间库。使用这种简单的语法,您的问题很简单:

var m = moment().add(3,'months').format('YYYY-DD-MM');
alert('Three months from now in YYYY-DD-MM format is:\n' + m);
<script src="http://momentjs.com/downloads/moment.min.js"></script>

moment()构造函数创建当前时刻,并具有操作和格式化它的方法,而不需要调试和测试的时间管理算法的所有细节。

答案 1 :(得分:0)

function change(myDate){
    var tmps = new Date(myDate).getTime();
    var newdate = (90*3600*24*1000)+tmps;
    var t=new Date(newdate);
    var dd= t.getDate() <10 ? "0"+t.getDate() : t.getDate();
    var mm=t.getMonth()+1 <10 ? "0"+(+t.getMonth()+1) : t.getMonth()+1;
    var yyyy=t.getFullYear();
    var tdate=yyyy+'-'+dd+'-'+mm; 
    alert(tdate);
document.getElementById("tdate").value = tdate;
}
change("2016-7-1"); // ==> 2016-29-09
//change(new Date("2016-8-1"));// ==> 2016-29-30
//change(new Date("2016/08/01"));// ==> 2016-29-10
//change(new Date(2016,(8-1),1));// ==> 2016-29-10
<input type='text' id="tdate" value=''/>

答案 2 :(得分:0)

在您的代码中,您有:

var tdate = yyyy + '-' + mm + '-' + dd;

所以你不应该对yyyy-mm-dd感到惊讶。 ;-)将其更改为:

var tdate = yyyy + '-' + dd + '-' + mm;

如果您希望获得3个月后的日期,您需要考虑当您在12月31日添加3个月时会发生什么。在较旧版本的ECMAScript中,2015年11月30日+ 3个月至2016年3月1日。较新版本将不允许该日期超过该月,因此结果将是2月29日。

E.g。在Firefox 49中:

&#13;
&#13;
var d = new Date(2015,10,30);
d.setMonth(d.getMonth()+3);
console.log(d); // 1 Mar 2016 or 29 Feb 2016 depending on implementation
&#13;
&#13;
&#13;

由于您无法确定主机符合哪个版本,因此您需要手动测试日期是否已翻转:

&#13;
&#13;
function addMonths(date, months) {
  var startMonth = date.getMonth();
  date.setMonth(date.getMonth() + months);
  // If the new month isn't correct, set to last day of previous month
  if ((startMonth + +months)%12 != date.getMonth()) {
    date.setDate(0);
  }
  return date
}

var d = new Date(2015,10,31);
addMonths(d, 3);
console.log(d)
&#13;
&#13;
&#13;

在您的代码中,Date get 方法不接受任何参数,因此忽略所提供的任何参数,例如。

date.getDate("startDate");

应该是

date.getDate();

等等。也:

var date = new Date();

将根据主机时区偏移创建一个新日期,但是当您根据其YYYY-MM-DD值创建一个字符串并执行:

 var myDate=yyyy+'-'+mm+'-'+dd;

它被视为UTC日期。对于格林威治以西的用户,日期似乎是提前一天。

如果您希望复制日期,只需将其作为Date构造函数的唯一参数:

var tmps = new Date(date);

如上所示,应添加月份。每3个月没有确切的90天,并且在每天观察到夏令时的地方,并不是每天都有24小时。因此,因素的组合意味着您不时添加3个月的算法似乎是随机错误的。

最后,YYYY-DD-MM的格式肯定会让绝大多数读者感到困惑。日期在很大程度上被误解了,因此最好的策略是以明确的形式编写它们,而使用月份名称而不是数字。或者如果您想使用唯一的数字形式,坚持使用ISO 8601 YYYY-MM-DD等众所周知的标准。