在项目中使用了 Nashorn,脚本中使用new Date() 获取了年月日,并重新new Date(timestamp)创建Date对象。
现象:
在别的函数中引用当前函数没问题,能返回正确的时间戳,但是自己直接调用,结果直接返回NaN
原因有二:
1. timestamp作为参数传入函数中,long类型被转成了字符串类型;
2. 有另一个参数months是int类型,也被转成了字符串,导致在月份11 + 1的时候,变成了"11" + 1 = "111",然后根据年月日拼接日期的时候,月份是111,new Date('xxxx-xxxx-xxxx 00:00:00')这样就不会正常返回日期了。
解决办法:
在参数使用前先转换成数值型
timestamp = parseInt(timestamp);
months = parseInt(months);
附上函数:
function addMonths(timestamp, months){
timestamp = parseInt(timestamp);
months = parseInt(months);
var date = new Date(timestamp);
var y = date.getFullYear();
var m = date.getMonth();
var d = date.getDate();
var hour = date.getHours();
var minute = date.getMinutes();
var second = date.getSeconds();
y += Math.floor((m + months) / 12); //计算年
m = Math.floor((m + months) % 12) + 1; //计算月
if(m <= 0){
m += 12;
}
var d_max = new Date(y + "/" + (m+1)+ "/0").getDate(); //获取计算后的月的最大天数
if (d > d_max) {
d = d_max;
}
return new Date(y + "/" + (m < 10 ? ("0" + m) : m) + "/" + (d < 10 ? ("0" + d) : d)
+ " " + (hour < 10 ? ("0" + hour) : hour) + ":" + (minute < 10 ? ("0" + minute) : minute)
+ ":" + (second < 10 ? ("0" + second) : second)).getTime();
}