怎么根据两个日期得到除节假日 周末外的天数

lusawlx 2013-01-17 09:02:20
有开始日期 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?
...全文
743 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
oxfed 2013-01-28
  • 打赏
  • 举报
回复
LZ结贴散分吧!
oxfed 2013-01-28
  • 打赏
  • 举报
回复
输入参数为2013-10-02,2013-10-07时答案为0,是因为忽略了一点:时间实际上为
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>

fzfei2 2013-01-28
  • 打赏
  • 举报
回复
引用 36 楼 lusawlx 的回复:
引用 31 楼 fzfei2 的回复:是你有日期没选,的原因吧,你加判断,只有两个日期都有值后才计算工作日 如果有些周六 日要算在里面的,改成这样又不对,workd放是周六 日但要算在天数中的 JavaScript code?12345678910111213141516171819202122232425262728var Holiday……
什么意思,是说workd[] 中的 日期规定为工作日?
lusawlx 2013-01-28
  • 打赏
  • 举报
回复
引用 34 楼 oxfed 的回复:
本人最讨厌在公共场所晾代码不写注释了。所有自己写了个带注释的. 该问题最关键是要理清不同种日期(节假日,周末,工作日(周一到周五))这3个集合之间的关系。 相信看了下面的韦恩图,代码谁都会写。 <script> //注:要求所有表示日期的字符串的形式为"2013-01-01" //var oneDay=24*60*60*1000; //所有节假日 var Holiday……
这个运行出来是0,应该不对
lusawlx 2013-01-28
  • 打赏
  • 举报
回复
引用 31 楼 fzfei2 的回复:
是你有日期没选,的原因吧,你加判断,只有两个日期都有值后才计算工作日
如果有些周六 日要算在里面的,改成这样又不对,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;
        }


scscms太阳光 2013-01-18
  • 打赏
  • 举报
回复
结合fzfei2的方法:
<script type="text/javascript">
    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>
已经测试通过你上面提到的几个日期,其他日期你测试一下。
oxfed 2013-01-18
  • 打赏
  • 举报
回复
本人最讨厌在公共场所晾代码不写注释了。所有自己写了个带注释的.
该问题最关键是要理清不同种日期(节假日,周末,工作日(周一到周五))这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>
fzfei2 2013-01-18
  • 打赏
  • 举报
回复
是你有日期没选,的原因吧,你加判断,只有两个日期都有值后才计算工作日
lusawlx 2013-01-18
  • 打赏
  • 举报
回复
引用 28 楼 fzfei2 的回复:
引用 26 楼 lusawlx 的回复: 以为问题解决了,但是应该到实现中就出现问题了 提示什么错 你要发生成后页面的代码

 <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)


        }


        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;");
        }
    }

}
lusawlx 2013-01-18
  • 打赏
  • 举报
回复
引用 28 楼 fzfei2 的回复:
引用 26 楼 lusawlx 的回复:
以为问题解决了,但是应该到实现中就出现问题了
提示什么错
你要发生成后页面的代码

下面是查看的源代码


<!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>






报的错是
oxfed 2013-01-18
  • 打赏
  • 举报
回复
楼主貌似前几天有问过类似的问题。目的是为了统计出勤天数吗?
lusawlx 2013-01-17
  • 打赏
  • 举报
回复
引用 13 楼 fzfei2 的回复:
加了算 Holiday 里的日期 JavaScript code ? 123456789101112131415 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-01到2013-10-07应该1天,出来是7天
fzfei2 2013-01-17
  • 打赏
  • 举报
回复
加了算 Holiday 里的日期

 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] )works++; //取星期天,六,加Holiday里的
  return works;
}
lusawlx 2013-01-17
  • 打赏
  • 举报
回复
引用 11 楼 fzfei2 的回复:
改了下,兼容低版本浏览器 JavaScript code ? 1234567891011 function workdays(d1,d2){ function toD(d){return new Date(d.replace(/-/g,'/')) } function ds(d){return d.getTime()/864E5>>0} var ……
太厉害了,看不大懂,能不能注释下 还有如果要排除掉 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 check(n,a) { for (var i = 0, len = a.length; i < len; i++) { if (a[i] == n) { return true; } } return false; }
fzfei2 2013-01-17
  • 打赏
  • 举报
回复
改了下,兼容低版本浏览器

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;
}
lusawlx 2013-01-17
  • 打赏
  • 举报
回复
引用 7 楼 xzy21com 的回复:
JavaScript code ? 1234567891011121314151617181920212223 <script> 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-……
出错啊,无法运行出来
lusawlx 2013-01-17
  • 打赏
  • 举报
回复
引用 7 楼 xzy21com 的回复:
JavaScript code ? 1234567891011121314151617181920212223 <script> 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-……
试运行出错
lusawlx 2013-01-17
  • 打赏
  • 举报
回复
引用 6 楼 fzfei2 的回复:
引用 4 楼 lusawlx 的回复: 引用 2 楼 fzfei2 的回复:JavaScript code ? 12345678910111213 function workdays(d1,d2){ function toD(d){return new Date(d.replace(/-/g,'/')).getTime()/864E5>>0} var d,d1=to……
这个无论什么日期出来出来都是0
scscms太阳光 2013-01-17
  • 打赏
  • 举报
回复
<script>
    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>
刚才忘记了周末计算。
fzfei2 2013-01-17
  • 打赏
  • 举报
回复
引用 4 楼 lusawlx 的回复:
引用 2 楼 fzfei2 的回复:JavaScript code ? 12345678910111213 function workdays(d1,d2){ function toD(d){return new Date(d.replace(/-/g,'/')).getTime()/864E5>>0} var d,d1=toD(d1),d2……
嗯写错了,原把转后天数拿来算星期出错了

function workdays(d1,d2){
  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;
}
加载更多回复(19)

87,917

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧