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
.
答案 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中:
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;
由于您无法确定主机符合哪个版本,因此您需要手动测试日期是否已翻转:
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;
在您的代码中,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等众所周知的标准。