有开始日期 ftdt,结束日期todt,要得到这两个日期除节假日 周末外的天数,
节假日放在一数组中了
var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04];当ftdt=2013-01-17 todt=2013-01-21
得到天数3当ftdt=2013-10-02 todt=2013-10-07
得到天数2得这么写这样一个function?
节假日放在一数组中了
var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04];当ftdt=2013-01-17 todt=2013-01-21
得到天数3当ftdt=2013-10-02 todt=2013-10-07
得到天数2得这么写这样一个function?
function workdays(d1,d2){
function toD(d){return new Date(d.replace(/-/g,'/')).getTime()/864E5>>0}
var d,d1=toD(d1),d2=toD(d2),works=0,i=0;
if(d1>d2){d=d1;d1=d2;d2=d}
d=new Date(d1).getDay();
while(d1<=d2)
if( (d+d2-d1++)%7%6 ) works++;
return works;
}
alert( workdays('2013-1-17','2013-1-21') );
<script type="text/javascript">
//计算天数差的函数 yyyy-mm-dd (sDate2-sDate1)间的天数 去掉周末 function DateDiffNoWeekDay(sDate1, sDate2) {
// var sDate1 = document.getElementById("date1").value;
/// var sDate2 = document.getElementById("date2").value; var sDate1 = "2013-01-13"
var sDate2 = "2013-01-21"
var oDate1 = StringToDate(sDate1); var oDate2 = StringToDate(sDate2);
var days = 1;
var tempDate = oDate1;
while (tempDate.getTime() < oDate2.getTime()) {
tempDate=addDays(tempDate,2); //加一天
if(!checkWeekDay(DateToString(tempDate)))
{//不是周末
days++;
}
}
//return days; alert(days);
} //yyyy-mm-dd 加上days天数后返回 yyyy-mm-ddfunction addDays(oDate,days){
if(days > 0){
days = days - 1;
}
if(days < 0){
days = days + 1;
}
var result = new Date(oDate.getTime()+(days*24 * 60 * 60 * 1000));
return result;
} //yyyy-mm-dd型转成Date
function StringToDate(sDate){
var aDate = sDate.split("-");
return new Date(aDate[1] + "-" + aDate[2] + "-" + aDate[0]);
}
//Date型转成yyyy-mm-dd
function DateToString(oDate) {
var month = oDate.getMonth() + 1;
var day = oDate.getDate();
if (month < 10) {
month = "0" + month;
}
if (day < 10) {
day = "0" + day;
}
return oDate.getFullYear() + "-" + month + "-" + day;
} /*判断是否含有周末,如果是周末 返回true,没有返回false*/
function checkWeekDay(sDate) {
aDate = sDate.split('-');
oDate = new Date(aDate[1] + "-" + aDate[2] + "-" + aDate[0])
day = oDate.getDay(); //判断是否周末
if (day == 0 || day == 6) {
return true;
}
return false;
}
</script> 这样写,如果2013-01-13 到2013-01-21 得6天才对,但是出来是7天
如果2013-01-14 到2013-01-21 出来6天是对的?
那里写错了?
var arr=[];
var ftdt="2013-10-02",todt="2013-10-07";
alert(get_fun(ftdt));
function get_fun(d){
var a_date=d.split("-"),t_date = new Date();
d=new Date(a_date[0],a_date[1]-1,a_date[2]);
t_date.setTime(d.getTime()+1000*60*60*24);
var nd=t_date.getFullYear()+"-"+("0"+(t_date.getMonth()+1)).slice(-2)+"-"+("0"+t_date.getDate()).slice(-2);
if (nd!=todt){
if(Holiday.indexOf(nd)!=-1){
arr[arr.length]=nd;
return get_fun(nd);
}else{
return get_fun(nd);
}
}else{
//return arr;//得到日期集合
return arr.length;//得到日期天数
}
}
function toD(d){return Date.parse(d)/864E5>>0}
var day=new Date(d1).getDay(),d,
d1=toD(d1),d2=toD(d2),works=0;
if(d1>d2){d=d1;d1=d2;d2=d}
while(d1<=d2) if( (day+d2-d1++)%7%6 ) works++;
return works;
}
var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
var arr=[];
var ftdt="2013-01-01",todt="2013-01-10";
alert(get_fun(ftdt));
function get_fun(d){
var a_date=d.split("-"),t_date = new Date();
d=new Date(a_date[0],a_date[1]-1,a_date[2]);
t_date.setTime(d.getTime()+1000*60*60*24);
var nd=t_date.getFullYear()+"-"+("0"+(t_date.getMonth()+1)).slice(-2)+"-"+("0"+t_date.getDate()).slice(-2);
if (nd!=todt){
if(Holiday.indexOf(nd)!=-1||t_date.getDay()==0||t_date.getDay()==6){
return get_fun(nd);
}else{
arr[arr.length]=nd;
return get_fun(nd);
}
}else{
//return arr;//得到日期集合
return arr.length;//得到日期天数
}
}
</script>刚才忘记了周末计算。
function toD(d){return new Date(d.replace(/-/g,'/')) }
function ds(d){return d.getTime()/864E5>>0}
var day,d,d1=toD(d1),d2=toD(d2),works=0;
if(d1>d2){d=d1;d1=d2;d2=d}
day=d1.getDay();
d1=ds(d1),d2=ds(d2);
while(d1<=d2)if( (day+d2-d1++)%7%6 ) works++;
return works;
}
一天天循环去跟数据里的值 比较 function check(n,a) {
for (var i = 0, len = a.length; i < len; i++) {
if (a[i] == n) {
return true;
}
}
return false;
}
function workdays(d1,d2){
function toD(d){return new Date(d.replace(/-/g,'/')) } //转成Date对象
function ds(d){return d.getTime()/864E5>>0} //天数
var day,d,d1=toD(d1),d2=toD(d2),d0=d1,works=0,o={},i=0;
for(var i=0,L=Holiday.length;i<L;i++) o[ ds(toD( Holiday[i]))]=1;
if(d1>d2){d=d1;d1=d2;d2=d} //确保d1<d2
day=d1.getDay(); //d1星期
d1=ds(d1),d2=ds(d2);
while(d1<=d2)
if( (day+d2-d1++)%7%6||o[d1] )works++; //取星期天,六,加Holiday里的
return works;
}
function workdays(d1,d2){
function toD(d){return new Date(d.replace(/-/g,'/')) } //转成Date对象
function ds(d){return d.getTime()/864E5>>0} //天数
var day,d,d1=toD(d1),d2=toD(d2),d0=d1,works=0,o={},i=0;
for(var i=0,L=Holiday.length;i<L;i++) o[ ds(toD( Holiday[i]))]=1;
if(d1>d2){d=d1;d1=d2;d2=d} //确保d1<d2
day=d1.getDay(); //d1星期
d1=ds(d1),d2=ds(d2);
while(d1<=d2)
if( (day+d2-d1++)%7%6||o[d1] )works++; //取星期天,六,加Holiday里的
return works;
}
var ftdt="2013-01-01",todt="2013-01-10";
alert(workdays(ftdt,todt));//结果是8天???
我想严重问题在于function toD(d){return new Date(d.replace(/-/g,'/')) }
"2012-01-01"==toD("2012/01/01")吗,不是呀!toD("2012/01/01")==2012-2-1
toD("2012-2-1")==toD("2012-02-01")==toD("2012/01/01") 这样是相等的,所以也支持 "2012-2-1"这格式
var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
function workdays(d1,d2){
function toD(d){return new Date(d.replace(/-/g,'/')) } //转成Date对象
function ds(d){return d.getTime()/864E5>>0} //天数
var day,d,d1=toD(d1),d2=toD(d2),d0=d1,works=0,o={},i=0;
for(var i=0,L=Holiday.length;i<L;i++) o[ ds(toD( Holiday[i]))]=1;
if(d1>d2){d=d1;d1=d2;d2=d} //确保d1<d2
day=d1.getDay(); //d1星期
d1=ds(d1),d2=ds(d2);
while(d1<=d2)
if( (day+d2-d1++)%7%6&&!o[d1-1] )works++; //取星期天,六,加Holiday里的
return works;
}
呵呵,workdays('2013-01-01','2013-01-10') =4
是对的,
但是workdays('2013-01-01','2013-01-07') =3是不对的
=============严重理解错我的意思:toD("2012-02-01")!="2012-02-01" 难道你忘了js里月份要比实现小1吗?所以按你的函数toD("2012-02-01")="2012-03-01"
alert(workdays("2013-01-30","2013-02-01"));//结果是3天!!!,而实现上只有一天2013-1-31
new Date("yyyy-mm-dd")这样的时候就不用管了-----------------------------
原是算的是大有问题,再试试 var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
function workdays(d1,d2){
function toD(d){return new Date(d.replace(/-/g,'/')) } //转成Date对象
function ds(d){return d.getTime()/864E5>>0} //天数
var day,d,d1=toD(d1),d2=toD(d2),d0=d1,works=0,o={},i=0,L;
for(i=0,L=Holiday.length;i<L;i++) { o[ ds(toD( Holiday[i]))]=1;};
if(d1>d2){d=d1;d1=d2;d2=d} //确保d1<d2
day=d1.getDay(); //d1星期
d1=ds(d1),d2=ds(d2),i=d2-d1+1;
while(i--) if( (day+i)%7%6 && !o[d1+i] ) works++; //取星期天,六,加Holiday里的
return works;
}
alert( workdays('2013-01-01','2013-01-7') )
真是太感谢了.
呵,如果离LZ近,LZ还真放请吃饭来的
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" EnableEventValidation="false"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<script type="text/javascript" src="My97DatePicker/calendar.js" ></script>
<script type="text/javascript" src="My97DatePicker/config.js" ></script>
<script type="text/javascript" src="My97DatePicker/WdatePicker.js" ></script>
<script type="text/javascript" src="js/jquery.js"></script>
<style type="text/css">
.disno{ display:none;}
body{font-size:12px;
}
.tx{ border:none; text-align:center;font-family:黑体; font-size:20px; width:115px; }
.tx1{ border:none; width: 128px;text-align:center;font-family:黑体; font-size:18px; }
.inp{ border:1px solid #cccccc; width:100px;}
</style>
<script type="text/javascript"> function CheckDate(source) {
var row_id = source.id.substr(0, source.id.lastIndexOf('_') + 1);
var textbox1 = document.getElementById(row_id + 'frdt');
var textbox2 = document.getElementById(row_id + 'todt');
var a=textbox1.value+" 23:59:59";
a=a.replace("-","/");
var dateA=new Date(a);
var dateNow=new Date();
if (Date.parse(dateNow) - Date.parse(dateA) > 0) {
alert("开始日期错误");
textbox1.focus();
return false;
}
if (textbox2.value!= "") {
if (textbox1.value > textbox2.value) {
alert("结束日期要比开始日期大");
return false; }
} var label = document.getElementById(row_id + 'num');
label.value = workdays(textbox1.value, textbox2.value)
}
var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03", "2013-05-01", "2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
function workdays(d1, d2) {
function toD(d) { return new Date(d.replace(/-/g, '/')) } //转成Date对象
function ds(d) { return d.getTime() / 864E5 >> 0 } //天数
var day, d, d1 = toD(d1), d2 = toD(d2), d0 = d1, works = 0, o = {}, i = 0, L;
for (i = 0, L = Holiday.length; i < L; i++) { o[ds(toD(Holiday[i]))] = 1; };
if (d1 > d2) { d = d1; d1 = d2; d2 = d } //确保d1<d2
day = d1.getDay(); //d1星期
d1 = ds(d1), d2 = ds(d2), i = d2 - d1 + 1;
while (i--) if ((day + i) % 7 % 6 && !o[d1 + i]) works++; //取星期天,六,加Holiday里的
return works;
} </script>
<style media="print" type="text/css">
.Noprint{display:none;}
.PageNext{page-break-after: always;}
</style>
</head>
<body >
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="images/new.gif" CssClass="imgbt" OnClick="ImageButton1_Click"/>
<asp:ImageButton ID="ImageButton2" runat="server" ImageUrl="images/del.gif" CssClass="imgbt" OnClick="btnDelete_Click"/>
<asp:hiddenfield runat="server" id="hfID"></asp:hiddenfield>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" OnRowCreated="GridView1_RowCreate">
<Columns>
<asp:TemplateField HeaderText="NO." ItemStyle-HorizontalAlign="center">
<ItemTemplate>
<asp:Label runat="server" ID="lblID" Text='<%#Eval("ID") %>'></asp:Label>
</ItemTemplate>
<ItemStyle HorizontalAlign="center" />
</asp:TemplateField>
<asp:TemplateField HeaderText="开始时间">
<ItemTemplate> <asp:TextBox ID="frdt" runat="server" CssClass="Wdate" Width="120" Text='<%#Eval("frdt")%>' onchange="CheckDate(this)">
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField> <asp:TemplateField HeaderText="结束日期">
<ItemTemplate>
<asp:TextBox ID="todt" runat="server" CssClass="Wdate" Width="120" Text='<%#Eval("todt") %>' onchange="CheckDate(this)">
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="使用个数">
<ItemTemplate>
<asp:TextBox ID="num" runat="server" Text='<%#Eval("num") %>' BorderWidth="0" Width="10"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView> </ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
无标题页
</title>
<script type="text/javascript" src="My97DatePicker/calendar.js" ></script>
<script type="text/javascript" src="My97DatePicker/config.js" ></script>
<script type="text/javascript" src="My97DatePicker/WdatePicker.js" ></script>
<script type="text/javascript" src="js/jquery.js"></script>
<style type="text/css">
.disno{ display:none;}
body{font-size:12px;
}
.tx{ border:none; text-align:center;font-family:黑体; font-size:20px; width:115px; }
.tx1{ border:none; width: 128px;text-align:center;font-family:黑体; font-size:18px; }
.inp{ border:1px solid #cccccc; width:100px;}
</style>
<script type="text/javascript">
function CheckDate(source) {
var row_id = source.id.substr(0, source.id.lastIndexOf('_') + 1);
var textbox1 = document.getElementById(row_id + 'frdt');
var textbox2 = document.getElementById(row_id + 'todt');
var a = textbox1.value + " 23:59:59";
a = a.replace("-", "/");
var dateA = new Date(a);
var dateNow = new Date();
if (Date.parse(dateNow) - Date.parse(dateA) > 0) {
alert("开始日期错误");
textbox1.focus();
return false;
}
if (textbox2.value != "") {
if (textbox1.value > textbox2.value) {
alert("结束日期要比开始日期大");
return false;
}
}
var label = document.getElementById(row_id + 'num');
label.value = workdays(textbox1.value, textbox2.value)
}
var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03", "2013-05-01", "2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
function workdays(d1, d2) {
function toD(d) { return new Date(d.replace(/-/g, '/')) } //转成Date对象
function ds(d) { return d.getTime() / 864E5 >> 0 } //天数
var day, d, d1 = toD(d1), d2 = toD(d2), d0 = d1, works = 0, o = {}, i = 0, L;
for (i = 0, L = Holiday.length; i < L; i++) { o[ds(toD(Holiday[i]))] = 1; };
if (d1 > d2) { d = d1; d1 = d2; d2 = d } //确保d1<d2
day = d1.getDay(); //d1星期
d1 = ds(d1), d2 = ds(d2), i = d2 - d1 + 1;
while (i--) if ((day + i) % 7 % 6 && !o[d1 + i]) works++; //取星期天,六,加Holiday里的
return works;
}
</script>
</head>
<body>
<form name="form1" method="post" action="write.aspx" id="form1">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTY0MDA3MzU0NA8WAh4CdGIyigwAAQAAAP////8BAAAAAAAAAAwCAAAATlN5c3RlbS5EYXRhLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAFVN5c3RlbS5EYXRhLkRhdGFUYWJsZQMAAAAZRGF0YVRhYmxlLlJlbW90aW5nVmVyc2lvbglYbWxTY2hlbWELWG1sRGlmZkdyYW0DAQEOU3lzdGVtLlZlcnNpb24CAAAACQMAAAAGBAAAAIsHPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+DQo8eHM6c2NoZW1hIHhtbG5zPSIiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJhbnUiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgbXNkYXRhOnRhcmdldE5hbWVzcGFjZT0iIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9ImZyZHQiIHR5cGU9InhzOnN0cmluZyIgbXNkYXRhOnRhcmdldE5hbWVzcGFjZT0iIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9InRvZHQiIHR5cGU9InhzOnN0cmluZyIgbXNkYXRhOnRhcmdldE5hbWVzcGFjZT0iIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9Im51bSIgdHlwZT0ieHM6c3RyaW5nIiBtc2RhdGE6dGFyZ2V0TmFtZXNwYWNlPSIiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgPC94czpjb21wbGV4VHlwZT4NCiAgPC94czplbGVtZW50Pg0KICA8eHM6ZWxlbWVudCBuYW1lPSJ0bXBEYXRhU2V0IiBtc2RhdGE6SXNEYXRhU2V0PSJ0cnVlIiBtc2RhdGE6TWFpbkRhdGFUYWJsZT0iYW51IiBtc2RhdGE6VXNlQ3VycmVudExvY2FsZT0idHJ1ZSI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCjwveHM6c2NoZW1hPgYFAAAA0gI8ZGlmZmdyOmRpZmZncmFtIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIiB4bWxuczpkaWZmZ3I9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLWRpZmZncmFtLXYxIj4NCiAgPHRtcERhdGFTZXQ+DQogICAgPGFudSBkaWZmZ3I6aWQ9ImFudTEiIG1zZGF0YTpyb3dPcmRlcj0iMCIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIj4NCiAgICAgIDxpZD4xPC9pZD4NCiAgICAgIDxmcmR0IC8+DQogICAgICA8dG9kdCAvPg0KICAgICAgPG51bT4wPC9udW0+DQogICAgPC9hbnU+DQogIDwvdG1wRGF0YVNldD4NCjwvZGlmZmdyOmRpZmZncmFtPgQDAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAA//////////8LFgICAw9kFgICAw9kFgJmD2QWAgIJDzwrABECAA8WBB4LXyFEYXRhQm91bmRnHgtfIUl0ZW1Db3VudAIBZAEQFgAWABYAFgJmD2QWBAIBD2QWBmYPZBYCAgEPDxYCHgRUZXh0BQExZGQCAQ9kFgICAQ8PZBYCHgdvbmNsaWNrBR5XZGF0ZVBpY2tlcih7ZWw6JGRwLiQoJ3R4YicpfSlkAgIPZBYCAgEPD2QWAh8EBR9XZGF0ZVBpY2tlcih7ZWw6JGRwLiQoJ3R4YjEnKX0pZAICDw8WAh4HVmlzaWJsZWhkZBgCBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAgUMSW1hZ2VCdXR0b24xBQxJbWFnZUJ1dHRvbjIFCUdyaWRWaWV3MQ88KwAMAQgCAWQn7tN6hq7HK9fAfvXQwAH7h9ZK4RKWUnTn1KaDp67J1Q==" />
</div>
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
<script src="/annual/WebResource.axd?d=J6cOxVqf_YZQOXnh_wyWi9ruyb2AZzXYMVck9-6jd-CmEGYqWLBxiLe8PupQ4OB520a-djoahUMxXwlQkPv6Sb3DmG287C2L4MsBoAQWus41&t=634778696730156250" type="text/javascript"></script>
<script src="/annual/ScriptResource.axd?d=IBP3T_emZxg5cFwa2tjrLq2w8UaoWf235Bf-FJ1kdGYbiop5FkK-o8qxaMZZi3J2lPlt8i-lACuuiy7I8FCA0Mc4W0mZolvO_PIIPik90Iat4B2mC5jR1TLvTNAO1zL7Kr2-jjjBoWHMzXKZo-RgP30nmAyCX4etIY_UQTC7FnHC1jn3w_M9lWM-A1jIersg0&t=ffffffff940d030f" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
if (typeof(Sys) === 'undefined') throw new Error('ASP.NET Ajax 客户端框架未能加载。');
//]]>
</script>
<script src="/annual/ScriptResource.axd?d=ZwyNDQe3fgCBUD2HsrcozcM-IUZ7F40F5gklVlH2reoNUzAjrrF90BNEXHuAF8bZg9mP1pbps2evq64CmFCGIQwPp7TPK7O7mqCY4ndUtJnCd6INuEQ7AxwUpJfiW-vFlYuN_Uiwy9KnnJlTIh5FH8eVhT6fkEkL0iAr458CvpLkbYNV9k3lmbs7UXncOM3D0&t=ffffffff940d030f" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('ScriptManager1', 'form1', ['tUpdatePanel1',''], [], [], 90, '');
//]]>
</script>
<div id="UpdatePanel1">
<input type="image" name="ImageButton1" id="ImageButton1" class="imgbt" src="images/new.gif" style="border-width:0px;" />
<input type="image" name="ImageButton2" id="ImageButton2" class="imgbt" src="images/del.gif" style="border-width:0px;" />
<input type="hidden" name="hfID" id="hfID" />
<span id="Label1">Label</span>
<div>
<table cellspacing="0" rules="all" border="1" id="GridView1" style="border-collapse:collapse;">
<tr>
<th scope="col">NO.</th><th scope="col">开始时间</th><th scope="col">结束日期</th><th scope="col">使用个数</th>
</tr><tr onClick="javascript:__doPostBack('GridView1','Select$0');" style="cursor:hand;">
<td align="center">
<span id="GridView1_ctl02_lblID">1</span>
</td><td>
<input name="GridView1$ctl02$frdt" type="text" id="GridView1_ctl02_frdt" class="Wdate" onchange="CheckDate(this)" onclick="WdatePicker({el:$dp.$('txb')})" style="width:120px;" />
</td><td>
<input name="GridView1$ctl02$todt" type="text" id="GridView1_ctl02_todt" class="Wdate" onchange="CheckDate(this)" onclick="WdatePicker({el:$dp.$('txb1')})" style="width:120px;" />
</td><td>
<input name="GridView1$ctl02$num" type="text" value="0" id="GridView1_ctl02_num" style="border-width:0px;width:10px;" />
</td>
</tr>
</table>
</div>
</div>
</form>
</body>
</html>
报的错是
var row_id = source.id.substr(0, source.id.lastIndexOf('_') + 1);
var textbox1 = document.getElementById(row_id + 'frdt');
var textbox2 = document.getElementById(row_id + 'todt');
var a = textbox1.value + " 23:59:59";
a = a.replace("-", "/");
var dateA = new Date(a);
var dateNow = new Date();
if (Date.parse(dateNow) - Date.parse(dateA) > 0) {
alert("开始日期错误");
textbox1.focus();
return false;
}
if (textbox2.value != "") {
if (textbox1.value > textbox2.value) {
alert("结束日期要比开始日期大");
return false; }
} var label = document.getElementById(row_id + 'num');
label.value = workdays(textbox1.value, textbox2.value)
}
function workdays(d1, d2) {
function toD(d) { return new Date(d.replace(/-/g, '/')) }
function ds(d) { return d.getTime() / 864E5 >> 0 }
var day, d, d1 = toD(d1), d2 = toD(d2), works = 0;
if (d1 > d2) { d = d1; d1 = d2; d2 = d }
day = d1.getDay();
d1 = ds(d1), d2 = ds(d2);
while (d1 <= d2) if ((day + d2 - d1++) % 7 % 6) works++;
return works;
}
</script>
如果用之前没有判断节假日的JS,就不会报错下面是后台对应的C#代码using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Data;public partial class write : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{ DataTable tb = new DataTable("anu");
DataColumn dc1 = new DataColumn("id", Type.GetType("System.String"));
DataColumn dc2 = new DataColumn("frdt", Type.GetType("System.String"));
DataColumn dc3 = new DataColumn("todt", Type.GetType("System.String"));
DataColumn dc4 = new DataColumn("num", Type.GetType("System.String")); tb.Columns.Add(dc1);
tb.Columns.Add(dc2);
tb.Columns.Add(dc3);
tb.Columns.Add(dc4);
DataRow dr = tb.NewRow();
dr["id"] = "1";
dr["frdt"] = "";
dr["todt"] = "";
dr["num"] = "0"; tb.Rows.Add(dr);
ViewState["tb"] = tb;
GridView1.DataSource = tb; GridView1.DataBind();
TextBox txb;
TextBox txb1;
for (int i = 0; i < GridView1.Rows.Count; i++)
{
txb = (TextBox)GridView1.Rows[i].FindControl("frdt"); txb.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb')})");
txb1 = (TextBox)GridView1.Rows[i].FindControl("todt"); txb1.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb1')})");
}
}
}
protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
{
TextBox txb;
TextBox txb1;
TextBox shownum;
DataTable tb = new DataTable("anu");
DataColumn dc1 = new DataColumn("id", Type.GetType("System.String"));
DataColumn dc2 = new DataColumn("frdt", Type.GetType("System.String"));
DataColumn dc3= new DataColumn("todt", Type.GetType("System.String"));
DataColumn dc4 = new DataColumn("num", Type.GetType("System.String")); tb.Columns.Add(dc1);
tb.Columns.Add(dc2);
tb.Columns.Add(dc3);
tb.Columns.Add(dc4);
int j = 0;
for (int i = 0; i < GridView1.Rows.Count; i++)
{
DataRow dr = tb.NewRow(); txb = (TextBox)GridView1.Rows[i].FindControl("frdt");
txb1 = (TextBox)GridView1.Rows[i].FindControl("todt");
shownum = (TextBox)GridView1.Rows[i].FindControl("num");
Label1.Text = shownum.Text;
dr["id"] = i+1;
dr["frdt"] = txb.Text;
dr["todt"] = txb1.Text;
dr["num"] = shownum.Text;
tb.Rows.Add(dr);
j++; } DataRow dr1 = tb.NewRow();
dr1["id"] = j+1;
dr1["frdt"] = "";
dr1["todt"] = "";
dr1["num"] = "0"; tb.Rows.Add(dr1);
GridView1.DataSource = tb;
GridView1.DataBind();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
txb = (TextBox)GridView1.Rows[i].FindControl("frdt"); txb.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb')})");
txb1 = (TextBox)GridView1.Rows[i].FindControl("todt"); txb1.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb1')})");
}
}
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
GridView1.SelectedRowStyle.BackColor = Color.FromName("#f7e7c0"); GridViewRow GridR = GridView1.SelectedRow;
string s = ((Label)GridR.FindControl("lblID")).Text;
hfID.Value = s;//将选中行的主键放入隐藏控件中
}
protected void btnDelete_Click(object sender, EventArgs e)
{ string id = hfID.Value;
//根据id获得这条记录,然后删除
TextBox txb;
TextBox txb1;
TextBox numshow;
DataTable tb = new DataTable("anu");
DataColumn dc1 = new DataColumn("id", Type.GetType("System.String"));
DataColumn dc2 = new DataColumn("frdt", Type.GetType("System.String"));
DataColumn dc3 = new DataColumn("todt", Type.GetType("System.String"));
DataColumn dc4 = new DataColumn("num", Type.GetType("System.String")); tb.Columns.Add(dc1);
tb.Columns.Add(dc2);
tb.Columns.Add(dc3);
tb.Columns.Add(dc4);
Label lbid;
for (int i = 0; i < GridView1.Rows.Count; i++)
{
txb = (TextBox)GridView1.Rows[i].FindControl("frdt");
txb1 = (TextBox)GridView1.Rows[i].FindControl("todt");
numshow = (TextBox)GridView1.Rows[i].FindControl("num");
lbid = (Label)GridView1.Rows[i].FindControl("lblID"); if (id != lbid.Text)
{
DataRow dr = tb.NewRow();
dr["id"] = lbid.Text;
dr["frdt"] = txb.Text;
dr["todt"] = txb1.Text;
dr["num"] = numshow.Text; tb.Rows.Add(dr);
} }
GridView1.DataSource = tb;
GridView1.DataBind();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
txb = (TextBox)GridView1.Rows[i].FindControl("frdt"); txb.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb')})");
txb1 = (TextBox)GridView1.Rows[i].FindControl("todt"); txb1.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb1')})");
} } protected void GridView1_RowCreate(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes.Add("onClick", "javascript:__doPostBack('" + GridView1.ClientID.Replace("_", "$") + "','Select$" + e.Row.RowIndex + "');");
e.Row.Attributes.Add("style", "cursor:hand;");
}
}}
var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
var ftdt="2013-10-01",todt="2013-10-07";
alert(get_fun(ftdt,todt));
function get_fun(bd,ed){
var arr=[];
function toD(d) { return new Date(d.replace(/-/g, '/')) }
var e=toD(ed);
function tml(t){
var n=new Date();
n.setTime(toD(t).getTime()+864E5);
return n.getFullYear()+"-"+("0"+(n.getMonth()+1)).slice(-2)+"-"+("0"+n.getDate()).slice(-2);
}
while (toD(bd)<=e){
var w=toD(bd).getDay();
if(w!=0&&w!=6&&Holiday.indexOf(bd)==-1)arr[arr.length]=bd;
bd=tml(bd);
}
//alert(arr);//输出符合条件的日期集合
return arr.length;//得到日期天数
}
</script>已经测试通过你上面提到的几个日期,其他日期你测试一下。
该问题最关键是要理清不同种日期(节假日,周末,工作日(周一到周五))这3个集合之间的关系。
相信看了下面的韦恩图,代码谁都会写。
<script>//注:要求所有表示日期的字符串的形式为"2013-01-01"
//var oneDay=24*60*60*1000;
//所有节假日
var Holidays= ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
var OnWorkWeekends=[]; //所有节假日调整而上班的周末日期
//设置起止日期
var startDate="2013-01-13";
var endDate="2013-01-21";
//function isWeekdays(iDate){ //判断日期是否是工作日
var dt=new Date(iDate);
if(dt.getDay()==0||dt.getDay()==6){
return false;
}
else {
return true;
}
}
function getDatesBetweenTime(dateList,startDate1,endDate1){//返回指定日期集合中处于查询时间段内的日期子集
var dateBetweenTime=new Array();
for(var k=0;k<dateList.length;k++){
if(dateList[k]>=startDate1 && dateList[k]<=endDate1){
dateBetweenTime.push(dateList[k]);
}
}
return dateBetweenTime;
}
//alert(isWeekdays(Date.parse("2013-01-01")));//获得时段内的节假日
var holidays=getDatesBetweenTime(Holidays,startDate,endDate);
//获得时段内的应节假日调整而上班的周末日期
var onWorkWeekends=getDatesBetweenTime(OnWorkWeekends,startDate,endDate); //alert(holidays);
//alert(onWorkWeekends);alert(computeWorkDays(holidays,onWorkWeekends.length,startDate,endDate));
function computeWorkDays(holidays,onWorkWeekendsLen,startDate,endDate){//计算startDate~endDate(包括两个端点)中的工作日期数 格式为"2013-01-01" var result=0; //记录结果
var oneDay=24*60*60*1000;
var weekdays=[];
var startDt=Date.parse(startDate);
var totalDays=(Date.parse(endDate)-Date.parse(startDate))/oneDay;
var nextDate=startDt;
//记录查询时间段内所有的属于周一到周五的日期
for(var i=0;i<totalDays;i++){
nextDate+=oneDay;
if(isWeekdays(nextDate)){
weekdays.push(nextDate);//weekdays中存的是日期的毫秒数
}
}
result=weekdays.length;
//剔除weekdays中的节假日
for(var j=0;j<holidays.length;j++){
if(isWeekdays(Date.parse(holidays[j]))){
result--;
}
} return (result+onWorkWeekendsLen);}</script>
如果有些周六 日要算在里面的,改成这样又不对,workd放是周六 日但要算在天数中的
var Holiday = ["2013-01-01", "2013-02-08", "2013-02-11", "2013-02-12", "2013-02-13", "2013-02-14", "2013-04-04", "2013-05-01", "2013-06-12", "2013-09-19", "2013-10-01", "2013-10-02", "2013-10-03"];
var workd = ["2013-02-02", "2013-02-03"];
function workdays(d1, d2) {
function toD(d) { return new Date(d.replace(/-/g, '/')) } //转成Date对象
function ds(d) { return d.getTime() / 864E5 >> 0 } //天数
var day, d, d1 = toD(d1), d2 = toD(d2), d0 = d1, works = 0, o = {}, i = 0, L, p = {};
for (i = 0, L = Holiday.length; i < L; i++) { o[ds(toD(Holiday[i]))] = 1; }; for (j = 0, W = workd.length; j < W; j++){ p[ds(toD(workd[j]))] = 1; };
if (d1 > d2) { d = d1; d1 = d2; d2 = d } //确保d1<d2
day = d1.getDay(); //d1星期
d1 = ds(d1), d2 = ds(d2), i = d2 - d1 + 1;
while (i--) if ((day + i) % 7 % 6 && !o[d1 + i]) works++; //取星期天,六,加Holiday里的
while (j--) {
if (p[d1 + j]) works++;
}
return works;
}
2013-10-02 00:00:00,2013-10-07 00:00:00,所有他们的时差实际上为(7-2)-1=4天,而我们实际上要计算的是5天内的工作天数。另外在循环的起点向后推了一天,这也是个小错误。以前错误的地方我下面用红色文字标识出来了,同时把以前的代码注释在后面。先补个图吧。(看了图大家都会明白的。再有小错误,自己修改,想信不会有了)
<script>//注:要求所有表示日期的字符串的形式为"2013-01-01"
//var oneDay=24*60*60*1000;
//所有节假日
var Holidays= ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
var OnWorkWeekends=[]; //所有节假日调整而上班的周末日期
//设置起止日期
var startDate="2013-10-02";
var endDate="2013-10-07";
//function isWeekdays(iDate){ //判断日期是否是工作日
var dt=new Date(iDate);
if(dt.getDay()==0||dt.getDay()==6){
return false;
}
else {
return true;
}
}
function getDatesBetweenTime(dateList,startDate1,endDate1){//返回指定日期集合中处于查询时间段内的日期子集
var dateBetweenTime=new Array();
for(var k=0;k<dateList.length;k++){
if(dateList[k]>=startDate1 && dateList[k]<=endDate1){
dateBetweenTime.push(dateList[k]);
}
}
return dateBetweenTime;
}
//alert(isWeekdays(Date.parse("2013-01-01")));//获得时段内的节假日
var holidays=getDatesBetweenTime(Holidays,startDate,endDate);
//获得时段内的应节假日调整而上班的周末日期
var onWorkWeekends=getDatesBetweenTime(OnWorkWeekends,startDate,endDate);//alert(holidays);
//alert(onWorkWeekends);alert(computeWorkDays(holidays,onWorkWeekends.length,startDate,endDate));
function computeWorkDays(holidays,onWorkWeekendsLen,startDate,endDate){//计算startDate~endDate(包括两个端点)中的工作日期数 格式为"2013-01-01"var result=0; //记录结果
var oneDay=24*60*60*1000;
var weekdays=[];
var startDt=Date.parse(startDate);var totalDays=(Date.parse(endDate)-Date.parse(startDate))/oneDay+1;/*上次的代码少了+1,少算了一天*/
var nextDate=startDt-oneDay;/*上次的代码中没有-oneDay,而循环是从下一天(nextDate+=oneDay;)开始的,应该是输入参数那一天,所有初始值减一天,即应初始化为开始日期的前一天*/
//记录查询时间段内所有的属于周一到周五的日期
for(var i=0;i<totalDays;i++){
nextDate+=oneDay;if(isWeekdays(nextDate)){
weekdays.push(nextDate);//weekdays中存的是日期的毫秒数
}
}
result=weekdays.length;//剔除weekdays中的节假日
for(var j=0;j<holidays.length;j++){
if(isWeekdays(Date.parse(holidays[j]))){
result--;
}
}return (result+onWorkWeekendsLen);}</script>