共有如下几种情况:
1、开始日期小于结束日期
2、两个日期相等,天数为0,之间没有日期
3、开始日期小于结束日期,天数为0,之间没有日期
<b>PS</b>:唯一的坑就是new Date()月份的参数介于 0 到 11 之间。也就是说,如果希望把月设置为 8 月,则参数应该是 7。
getTime() :返回从 1970 年 1 月 1 日至今的毫秒数。
getDate():返回日期,一个月中的某一天
setDate():设置日期,一个月中的某一天
如何通过JS计算两个日期相差天数(月份同理):var s1 = "2007-01-01".replace(/-/g, "/")var s2 = "2007-12-31".replace(/-/g, "/")
d1 = new Date(s1)
d2 = new Date(s2)
var time= d2.getTime() - d1.getTime()
var days = parseInt(time / (1000 * 60 * 60 * 24))
alert("相差天数: " + days)JS计算两个时间之间的月份差: //本代码经过我自己的测试没问题
//注意 d_start、和d_end是Date对象
//d_start可以这样创建:Date d_start = new Date(2010,03,31)
//d_end可以这样创建:Date d_start = new Date(2010,04,1)
//startTmp、endTmp是数组对象 解决日期是XXXX年XX月31日是所遇见的问题(如2010-03-31被java script看成//是2010-04-01,我发现xxxx-xx-31在java script中它的毫秒值和它的下一个月的第一天一样)
//那么对应的startTmp的值为[2010,3,31],endTmp[2010,4,1]
//
注意后面有个简单的方法,并且我解释了上面的问题出现的原因
//
function diffDay(d_start, d_end, startTmp, endTmp){
var confict_day = 0
var y_startIsLeap = false
var y_start = d_start.getYear()
var y_end = d_end.getYear()
var m_start = startTmp[1]
var m_end = endTmp[1]
//judge whether year is run year eg 2000
if(isLeapYear(y_start)){
y_startIsLeap = true
}
//judge whether same year
if(y_start!=y_end){
confict_day ++
}else{
if(m_start==m_end){
confict_day ++
}
if(m_start==1&&m_end==2){
if(y_startIsLeap){
confict_day+=3
}else{
confict_day+=4
}
}
if(m_start==2&&m_end==3){
if(y_startIsLeap){//start is leap year
confict_day --
}else{
confict_day -=2
}
}
if(is31DayMonth(m_start)&&is30DayMonth(m_end)){
confict_day =2
}
}
var tmp = (d_end.getTime()-d_start.getTime())/24/60/60/1000
tmp +=confict_day
return tmp
}
function isLeapYear(year){
var flag = false
year+=1900
if((year%400==0)||(year%4==0&&year%100!=0)){
flag = true
}
return flag
}
function is30DayMonth(month){
var tmp = [4,6,9,11]
month = month-0
var flag = false
for(var i=0i<tmp.lengthi++){
if(month==tmp[i]){
flag = true
break
}
}
return flag
}
function is31DayMonth(month){
var tmp = [1,3,5,7,8,10,12]
var flag = false
month = month-0
for(var i=0i<tmp.lengthi++){
if(month==tmp[i]){
flag = true
break
}
}
return flag
}
function isFebMonth(month){
month = month-0
var flag = false
if(month==2){
flag = true
}
return flag
}
function isLastDay(year, month, date){
var flag = false
if(date==30&&is30DayMonth(month)){
flag = true
}else if(date==31&&is31DayMonth(month)){
flag = true
}else if(isFebMonth(month)){
if(isLeapYear(year)&&date==29){
flag = true
}else if(!isLeapYear(year)&&date==28){
flag = true
}
}
return flag
}
javascript的API发现在js中月份的范围是0-11即从0开始(0表示一月份),所以也就会出现我前面说的2010-03-31被js看成是2010-04-01,其实是这么回事:2010-03-31在js中表示的时间是2010年4月31日而不是2010-3-31,我们知道4月份是没有31日的,所以js会默认地帮你向后移一天也即2010-4-1(注意这里表示的时间是2010年5月1日)
因此我们只要在原来的月份上减去一,然后通过getTime()获取毫秒数,并两者相减,再除以一天的毫秒数即得到所谓的相隔天数!!!
EG:
var start = $("#startDate").val()
var end = $("#endDate").val()
var reason =$("#reason").val()
var days = $("#leaveDays").val()
if(!start.match(new RegExp('^[0-9]+-[0-9]+-[0-9]+.*$'))){
alert("Please choosh the start date!")
return
}
if(!end.match(new RegExp('^[0-9]+-[0-9]+-[0-9]+.*$'))){
alert("Please choosh the end date!")
return
}
if(reason==''){
alert("Please input reason!")
return
}
var startTmp = start.split("-")
var endTmp = end.split("-")
var dS = new Date(startTmp[0],startTmp[1]-1,startTmp[2])//注意这里减除一
var dE = new Date(endTmp[0],endTmp[1]-1,endTmp[2])//注意这里减除一
var nowDate = new Date()
var nowTmp = new Date(nowDate.getYear()+1900,nowDate.getMonth(),nowDate.getDate())
if((nowTmp-dS)>0){
alert("Start date can't early today!")
return
}
var distance = (dE-dS)/86400000
distance++
这样就可以了,不用向上面的这么复杂
核心就在上面的时间月份是从1月开始的(与js默认的月份从0开始不一致!!!)
参考资料: http://www.qnr.cn/pc/erji/JAVA/jiqiao/200911/244838.html http://js.alixixi.com/a/20090228703.shtml http://blog.csdn.net/luoduyu/archive/2007/07/27/1711409.aspx