js源码--日期

转载 2007年09月18日 15:40:00
转自:

LxcJie的专栏

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<SCRIPT LANGUAGE="JavaScript">
/*----------------------------可以放到外部JS中,DateInputControl.js--------------------*/

/*
* Added by LiuXiaoChong 2005.4.25
* 限制输入的日期控件
* Param: txtName 为要限制输入的文本框的名称
*
* 功能描述:1,只能输入数字
*                    2,左右键可以移动编辑焦点
*                    3,上下键可以对数据进行微调
*                    4,控件包含了对日期的合法校验
*/

var isNS = navigator.appName.indexOf("Netscape"!= -1//NS,FF
var isIE = navigator.appName.indexOf("Microsoft"!= -1;
var fontWidth = 7//字体宽度跟显示器像素无关,跟文本框的字体大小有关系,现在常用的几个字体大小记录如下:
                   //12pt - W6
                   //13pt - W7 默认字体大小
                   //14pt - W7
                   //15pt - W8
                   //如果是IE可以用程序计算出来,但是NS,FF没找到对应的解决方案,只能有手工来测了:(

/*----------------------------可以放到外部JS中 DateInputControl.js--------------------*/
function init()
{
    regDateControl(
'date1');
}


function regDateControl(txtName)
{
    
var oInput = document.getElementById(txtName);
    oInput.middleChar 
= "-";
    oInput.selectIndex 
= 1//默认选中年
    oInput.maxLength = 10;
    
//oInput.style.imeMode = "disabled";
    oInput.value = specialText_GetDate(oInput.middleChar);
    
//如果是IE,则自己计算
    if(isIE)
        oInput.charWidth 
= oInput.createTextRange().boundingWidth / oInput.maxLength;
    
//否则,用自己定义的宽度
    else
        oInput.charWidth 
= fontWidth;

    
//注册单击事件
    oInput.onclick = specialText_ClickEvent;
    
if(isIE)
        oInput.onkeydown 
= specialText_KeyEvent;
    
else
        oInput.onkeypress 
= specialText_KeyEvent;
    oInput.onfocus 
= function(){specialText_SelectYear(this);}
    oInput.onblur 
= function()
    
{
        specialText_validYear(
this);
        specialText_validMonth(
this);
        specialText_validDate(
this);
    }

    
//屏蔽鼠标右键和拖动操作
    oInput.oncontextmenu = function(){return false;}
    oInput.ondrop 
= function(){return false;} //###################
}


/*---------------------辅助函数-----------------------*/
//得到默认日期
function specialText_GetDate(middleChar)
{
    
var oDate = new Date();
    
return oDate.getFullYear() + middleChar
           
+ (oDate.getMonth() < 10 ? ("0" + (oDate.getMonth()+1)) : (oDate.getMonth()+1)) + middleChar
           
+ (oDate.getDate() < 10 ? ("0" + oDate.getDate()) : oDate.getDate());
}


//鼠标单击,根据位置对日期进行分体选择
function specialText_ClickEvent(oEvent)
{
   
    
if(isIE)
    
{
        event.cancelBubble 
= true;
        oEvent 
= window.event;
    }

    
else if(isNS)
        oEvent.stopPropagation();

    specialText_validYear(
this);
    specialText_validMonth(
this);
    specialText_validDate(
this);
   
    
var offX,offY;
   
    
if(isIE)
        offX 
= oEvent.offsetX;
    
else if(isNS)
           offX 
= oEvent.pageX - this.offsetLeft;

    
if(offX <= specialText_getCharWidth(this.charWidth,4))
        specialText_SelectYear(
this);
    
else if(offX > specialText_getCharWidth(this.charWidth,4)
            
&& offX <= specialText_getCharWidth(this.charWidth,7))
        specialText_SelectMonth(
this);
    
else if(offX > specialText_getCharWidth(this.charWidth,7))
        specialText_SelectDate(
this);
}


//得到字符像素宽度
function specialText_getCharWidth(charWidth,charNum)
{
    
return charNum * charWidth;
}


//选中年份
function specialText_SelectYear(oInput)
{
    
if(isIE)
    
{
        
var oRange = oInput.createTextRange();
        oRange.moveStart(
"character",0);
        oRange.moveEnd(
"character",-6);
        
//代表选中了年
        oInput.selectIndex = 1;
        oRange.select();
    }

    
else if(isNS)
    
{
        oInput.setSelectionRange(
0,4);
        
//代表选中了年
        oInput.selectIndex = 1;
    }

}

//选中月份
function specialText_SelectMonth(oInput)
{
    
if(isIE)
    
{
        
var oRange = oInput.createTextRange();
        oRange.moveStart(
"character",5);
        oRange.moveEnd(
"character",-3);
        
//代表选中了月
        oInput.selectIndex = 2;
        oRange.select();
    }

    
else if(isNS)
    
{
        oInput.setSelectionRange(
5,7);
        
//代表选中了月
        oInput.selectIndex = 2;
    }

}

//选中日期
function specialText_SelectDate(oInput)
{
    
if(isIE)
    
{
        
var oRange = oInput.createTextRange();
        oRange.moveStart(
"character",8);
        
//代表选中了日期
        oInput.selectIndex = 3;
        oRange.select();
    }

    
else if(isNS)
    
{
        oInput.setSelectionRange(
8,10);
        
//代表选中了日期
        oInput.selectIndex = 3;
    }

}


//校验年份有效性
function specialText_validYear(oInput)
{
    
var arrValue = oInput.value.split(oInput.middleChar);
    
var strYear = arrValue[0];

    
if(parseInt(strYear,10== 0)
        arrValue[
0= 2000;
    
//如果年份小于4位,则在2000基础上增加
    else if(strYear.length < 4)
        arrValue[
0= 2000 + parseInt(strYear,10);
    oInput.value 
= arrValue.join(oInput.middleChar);
}

//校验月份有效性
function specialText_validMonth(oInput)
{
    
var arrValue = oInput.value.split(oInput.middleChar);
    
var strMonth = arrValue[1];
    
//如果月份输入了0,则按1月处理
    if(parseInt(strMonth,10== 0)
         arrValue[
1= "01";
    
//如果月份是一位,则前面补0
    else if(strMonth.length < 2)
        arrValue[
1= "0" + strMonth;
    
//如果月份大于12月,自动转为12月
    else if(parseInt(strMonth,10> 12)
        arrValue[
1= "12";
    oInput.value 
= arrValue.join(oInput.middleChar);
}

//校验日期有效性
function specialText_validDate(oInput)
{
    
var arrValue = oInput.value.split(oInput.middleChar);
    
var strYear = arrValue[0];
    
var strMonth = arrValue[1];
    
var strDate = arrValue[2];
    
var intMonth = parseInt(strMonth,10);
    
if(parseInt(strDate,10== 0)
        arrValue[
2= "01";
    
else if(strDate.length < 2)
        arrValue[
2= "0" + strDate;
    
else
    
{
        
//如果超过了月份的最大天数,则置为最大天数
        var monthMaxDates = specialText_getMonthDates(strYear,strMonth);
        
if(parseInt(strDate,10> monthMaxDates)
            arrValue[
2= monthMaxDates;
    }

    oInput.value 
= arrValue.join(oInput.middleChar);
}


//得到某年某月的最大天数
function specialText_getMonthDates(strYear,strMonth)
{
    
var intMonth = parseInt(strMonth,10);
    
if(intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7
       
|| intMonth == 8 || intMonth == 10 || intMonth == 12)
        
return 31;
    
//处理30天的月份
    else if(intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11)
        
return 30;
    
//处理2月份
    else
    
{
        
//闰年
        if(specialText_isLeapYear(strYear))
            
return 29;
        
//平年
        else
            
return 28;
    }

}

//判断是否是闰年
function specialText_isLeapYear(strYear)
{
    
var intYear = parseInt(strYear,10);
    
if((intYear % 4 == 0 && intYear % 100 != 0||
       (intYear 
% 100 == 0 && intYear % 400 == 0))
        
return true;
    
else
        
return false;
}


function specialText_YearAdd(oInput,isMinus)
{
    
var arrValue = oInput.value.split(oInput.middleChar);
    
var strYear = arrValue[0];
    
if(isMinus)
    
{
        arrValue[
0= parseInt(strYear,10- 1;
        
if(parseInt(arrValue[0],10< 1)
            arrValue[
0= "0001";
    }

    
else
        arrValue[
0= parseInt(strYear,10+ 1;
    oInput.value 
= arrValue.join(oInput.middleChar);
    specialText_validYear(oInput);
    specialText_SelectYear(oInput);
}


function specialText_MonthAdd(oInput,isMinus)
{
    
var arrValue = oInput.value.split(oInput.middleChar);
    
var strMonth = arrValue[1];
    
if(isMinus)
    
{
        arrValue[
1= parseInt(strMonth,10- 1;
        
if(parseInt(arrValue[1],10== 0)
            arrValue[
1= "12";
    }

    
else
    
{
        arrValue[
1= parseInt(strMonth,10+ 1;
        
if(parseInt(arrValue[1],10== 13)
            arrValue[
1= "01";
    }

    oInput.value 
= arrValue.join(oInput.middleChar);
    specialText_validMonth(oInput);
    specialText_SelectMonth(oInput);
}


function specialText_DateAdd(oInput,isMinus)
{
    
var arrValue = oInput.value.split(oInput.middleChar);
    
var strYear = arrValue[0];
    
var strMonth = arrValue[1];
    
var strDate = arrValue[2];
    
var monthMaxDates = specialText_getMonthDates(strYear,strMonth);

    
if(isMinus)
    
{
        arrValue[
2= parseInt(strDate,10- 1;
        
if(parseInt(arrValue[2],10== 0)
            arrValue[
2= monthMaxDates;
    }

    
else
    
{
        arrValue[
2= parseInt(strDate,10+ 1;
        
if(parseInt(arrValue[2],10== (monthMaxDates + 1))
            arrValue[
2= "01";
    }

    oInput.value 
= arrValue.join(oInput.middleChar);
    specialText_validDate(oInput);
    specialText_SelectDate(oInput);
}


function specialText_KeyEvent(oEvent)
{
    
if(window.event)
        oEvent 
= window.event;

    
//如果按了数字键
    if((oEvent.keyCode >= 48 && oEvent.keyCode <= 57||
       (oEvent.keyCode 
>= 96 && oEvent.keyCode <= 105))
    
{    
        
if(isIE)
        
{
            
var oRange = document.selection.createRange();
            
if(oRange.text.indexOf(this.middleChar) != -1)
                oEvent.returnValue 
= false;
        }

        
else if(isNS)
        
{
            
var txtVal = this.value.substring(oInput.selectionStart,oInput.selectionEnd)
            
if(txtVal.indexOf(this.middleChar) != -1)
                oEvent.preventDefault();
        }

    }

    
//如果按了方向键
    else if(oEvent.keyCode >= 37 && oEvent.keyCode <= 40)
    
{
        
if(isIE)
            oEvent.returnValue 
= false;
        
else if(isNS)
            oEvent.preventDefault();
           
        
var keyCode = oEvent.keyCode;
        
//按了左键
        if(keyCode == 37)
        
{
            
if(this.selectIndex == 1)
            
{
                specialText_validYear(
this);
                specialText_SelectDate(
this);
            }

            
else if(this.selectIndex == 2)
            
{
                specialText_validMonth(
this);
                specialText_SelectYear(
this);
            }

            
else if(this.selectIndex == 3)
            
{
                specialText_validDate(
this);
                specialText_SelectMonth(
this);
            }

        }

        
//按了右键
        if(keyCode == 39)
        
{
            
if(this.selectIndex == 1)
            
{
                specialText_validYear(
this);
                specialText_SelectMonth(
this);
            }

            
else if(this.selectIndex == 2)
            
{
                specialText_validMonth(
this);
                specialText_SelectDate(
this);
            }

            
else if(this.selectIndex == 3)
            
{
                specialText_validDate(
this);
                specialText_SelectYear(
this);
            }

        }


        
//按了上键
        if(keyCode == 38)
        
{
            
if(this.selectIndex == 1)
            
{
                specialText_validYear(
this);
                specialText_YearAdd(
this,true);
            }

            
else if(this.selectIndex == 2)
            
{
                specialText_validMonth(
this);
                specialText_MonthAdd(
this,true);
            }

            
else if(this.selectIndex == 3)
            
{
                specialText_validDate(
this);
                specialText_DateAdd(
this,true);
            }

        }


        
//按了下键
        if(keyCode == 40)
        
{
            
if(this.selectIndex == 1)
            
{
                specialText_validYear(
this);
                specialText_YearAdd(
this,false);
            }

            
else if(this.selectIndex == 2)
            
{
                specialText_validMonth(
this);
                specialText_MonthAdd(
this,false);
            }

            
else if(this.selectIndex == 3)
            
{
                specialText_validDate(
this);
                specialText_DateAdd(
this,false);
            }

        }

    }

    
//如果按了F5 或 TAB,不屏蔽
    else if(oEvent.keyCode == 116 || oEvent.keyCode == 9)
    
{
        oEvent.returnValue 
= true;
    }

    
else
    
{
        
if(isIE)
        
{
            oEvent.returnValue 
= false;
        }

        
else if(isNS)
        
{
            oEvent.preventDefault();
        }


        oEvent.keyCode 
= 0;
    }

}

</SCRIPT>
</head>
<body onload="init()">
<form name="formName">
<INPUT TYPE="text" id="date1" NAME="date1">
</form>
</body>
</html>

JS日期处理工具类

var now = new Date(); //当前日期 var nowDayOfWeek = now.getDay(); //今天本周的第...
  • qbg19881206
  • qbg19881206
  • 2013年04月02日 19:09
  • 1387

js中Date()的用法及日期计算方法

Date函数是用来处理日期和时间的,其时间是和GMT时间1970年1月1日进行比较的。 Date函数有6种构造函数,如下: new Date();                         ...
  • mafan121
  • mafan121
  • 2016年08月25日 16:01
  • 5393

JS比较两个日期大小

本文介绍下,在javascript代码中,比较两个日期大小的方法,有需要的朋友参考下。 转自:http://www.jbxue.com/article/11231.html 1,比较日期大小的...
  • molashaonian
  • molashaonian
  • 2017年03月18日 14:09
  • 5302

JS与正则表达式对日期的验证

一、首先看需求      日期的输入:   手动输入,可输入两种格式yyyymmdd或yyyy-mm-dd   二、解决思路 用户手动输入日期,需要验证输入的日期格式 用户可能的输入情况可以分为以...
  • akkzhjj
  • akkzhjj
  • 2013年11月21日 20:21
  • 5517

Js获取当前日期和农历日期

[javascript] view plain copy today=new Date();   function initArray(){      this.le...
  • lmhuanying1012
  • lmhuanying1012
  • 2017年11月07日 07:52
  • 289

JS日期加减,日期运算

因为是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因。 如有冒犯请联系本人,或删除,或标明出处。 因为好的文章,以前只想收藏,但连接有时候...
  • sat472291519
  • sat472291519
  • 2014年01月10日 10:39
  • 46225

javascript日期时间操作总结

js获得当前系统日期时间       js时间显示     var curr_time = new Date();  var strDate = curr_time.get...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年03月02日 16:27
  • 1495

js判断输入日期是否在当前日期之前

js判断输入时期是否在当前日期之前
  • u012383839
  • u012383839
  • 2015年04月09日 09:49
  • 718

生成一年日期的js

注 var today = new Array("日", "一","二", "三", "四", "五", "六");//创建星期数组 var monthday...
  • wingahi
  • wingahi
  • 2014年11月06日 23:21
  • 734

js转换Date日期格式

var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-????...
  • tomcat_2014
  • tomcat_2014
  • 2016年01月14日 09:38
  • 36818
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js源码--日期
举报原因:
原因补充:

(最多只允许输入30个字)