js中的给出一个日期,然后给出一个天数,要计算过了这多天后的日期。其中得到的日期要排除星期六和星期天
js计算工作日期???
如:起始日期:2010/8/1
工作了:10 天
结束日期为:2010/8/14
如何用js实现???并且如果第一个日期是星期六或星期天又怎么解决!
急啊!!各位高手救命啊!我也 写了一个,但是有很多问题!
js计算工作日期???
如:起始日期:2010/8/1
工作了:10 天
结束日期为:2010/8/14
如何用js实现???并且如果第一个日期是星期六或星期天又怎么解决!
急啊!!各位高手救命啊!我也 写了一个,但是有很多问题!
解决方案 »
- 请教一下大家,如何用javascript来给一排数组是姓名的汉字进行排序
- 一个奇怪的问题,关于document.getElementsByTag的
- 大家帮我看看这个函数的作用:parent.popupLoad.style.visibility="visible";谢谢。
- javascript中的调试方法有几种?
- 不管滚动条在什么位置,怎么在让某个div出现在屏幕的中间呢
- 这个问题需要用到javascript,请帮助!
- 请问如何把带链接的图片边框去掉
- 数状结构!!!紧急?
- 内存中的二进制图片数据如何显示为img?
- js 怎么点table <td>的<a herf ="#"> 出现弹窗
- 404错误,如何实现自动跳转
- js脚本问题
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<title>假日?算</title>
<script language="javascript">
//假日表
var holidays = new Array();
holidays[holidays.length] = new Date("2009/10/06");
holidays[holidays.length] = new Date("2009/10/10"); function getWorkDays(){
var dd = document.getElementById("days");
var startDate=document.getElementById("dateFrom").value;
var obj= new Array(); //定?一??
var obj= startDate.split("-");
var startDate1=obj[0]+"/"+obj[1]+"/"+obj[2];
var endDate =document.getElementById("dateTo").value;
var objEnd= new Array(); //定?一??
var objEnd = endDate.split("-");
var endDate1=objEnd[0]+"/"+objEnd[1]+"/"+objEnd[2]; dd.value=calculateWorkDays(startDate1,endDate1,holidays);
} function calculateWorkDays(fromStr, toStr,holidayArray){
var from = new Date();
var to = new Date();
var fromTime = Date.parse(fromStr);
var toTime = Date.parse(toStr);
from.setTime(fromTime);
from.setHours(0);
from.setMinutes(0);
from.setSeconds(0);
var orgTime = from.getTime(); to.setTime(toTime);
to.setHours(0);
to.setMinutes(0);
to.setSeconds(0); if(from.getTime() > to.getTime()){
return 0;
}
//把起始日都修正到星期六 javascript的星期?0?始,所以+1??理
var sDayofWeek = from.getDay()+1;
var workdays=0; if(sDayofWeek > 1 && sDayofWeek < 7)
{
from.setDate(from.getDate()-(sDayofWeek%7));
workdays-=((sDayofWeek-2)>0)?sDayofWeek-2:0;
}
//?算??日期之?的天? var totalDays = (to.getTime()-from.getTime())/(1000*60*60*24)+1;
workdays+=Math.floor(totalDays/7)*5; //修正最后剩余天?
if((totalDays%7-2)>0){
workdays+=(totalDays%7-2);
} if(holidayArray!=null){
for(var i=0;i<holidayArray.length;i++){
if(holidayArray[i].getTime()>orgTime && holidayArray[i].getTime()<to.getTime()){
if(holidayArray[i].getDay()>0 && holidayArray[i].getDay()<6){
workdays--;
}
}
}
} return workdays;
} </script>
</head>
<body>
<form>
?<input type="text" id="dateFrom" name="fromDate" value="2009-08-06" size="10">
到<input type="text" id="dateTo" name="toDate" value="2009-08-07" size="10">
有<input type="text" id="days" name="days" value="" size="5">?工作日
<input type="button" name="BT" value="?算工作日" onclick="getWorkDays()">
</form>
</body>
</html>
function f1(date, days){
var dateVal = date.getTime();
var oneDayVal = 24*60*60*1000;
var newDateVal = dateVal;
for(var i = 0 ; i < days; i++){
var newDay = new Date(newDateVal).getDay();
if(newDay == 0 || newDay == 6){
days++;
}
newDateVal += oneDayVal;
}
return new Date(newDateVal);
}
var startDate = new Date(2010,7,1);
alert(f1(startDate, 10));
<script type="text/javascript">
var start = "2010-8-1", day = 10, s = 24 * 60 * 60 * 1000, w;
var date = new Date(start.replace(/-/g, "/"));
while(day > 0){
w = date.getDay();
if(w > 0 && w < 6){
day--;
}
date.setTime(date.getTime() + s);
}
alert(date.toLocaleString());
</script>
仔细看了还写不出 在急不迟
循环是最容易想到的思路,但也是效率最差的解法,
当 days 变大且反复调用时,效率问题就很明显了!非循环算法如下,workingDays = 1000000 与 workingDays = 100 是一样的!L@_@K <!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>javascript.Date.CalculateDepartureDate.html</title>
<meta name="generator" content="editplus" />
<meta name="author" content="[email protected]" />
<meta name="keywords" content="" />
<meta name="description" content="" />
</head>
<body>
<script type="text/javascript">
<!--
/*
需求描述:给定任意日期作为入职日期,工作N个工作日之后,计算离职日期?
注:
“工作日”为周一至周五,不包含周六、日。
“首个工作日”从注册日期之后算起,即不包含注册日期在内。
“离职日期”为最后一个工作日的后一天。如:
入职日期:2010/8/1
工作天数:10
离职日期:2010/8/14
*/// 入职日期
var entryDate = ParseDate("2010/8/1");
// 工作天数
var workingDays = 10;
// 离职日期
var departureDate = GetDepartureDate(entryDate, workingDays);document.write(GetDateString(departureDate));function GetDepartureDate(entryDate, workingDays) {
// 每周工作天数。
var workingDaysPerWeek = 5;
// 离职日期
var departureDate = null;
// 首个工作日
var firstWorkingDate = GetFirstWokingDate(entryDate);
// 周末跨度数
var weekendSpan = 0;
// 第一周工作天数。
var firstWeekWorkingDays = 0;
// 最后一周工作天数。
var lastWeekWorkingDays = 0;
// 从首个工作日之后,到离职日期之间持续的天数(包括离职日期在内)。
var continuedDaysAfterFirstWorkingDate = 0; if (IsMonday(firstWorkingDate)) {
continuedDaysAfterFirstWorkingDate = GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan);
} else {
firstWeekWorkingDays = workingDaysPerWeek - firstWorkingDate.getDay() + 1;
if (firstWeekWorkingDays >= workingDays) {
continuedDaysAfterFirstWorkingDate = workingDays;
} else {
weekendSpan += 1;
workingDays -= firstWeekWorkingDays;
continuedDaysAfterFirstWorkingDate = firstWeekWorkingDays + GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan);
}
}
departureDate = GetDateAfterGivenDate(firstWorkingDate, continuedDaysAfterFirstWorkingDate); return departureDate;
}
function ParseDate(yyyyMMddString) {
return new Date(Date.parse(yyyyMMddString));
}
function GetFirstWokingDate(entryDate) {
var firstWorkingDate = GetNextDate(entryDate); while (!IsWorkingDate(firstWorkingDate)) {
firstWorkingDate = GetNextDate(firstWorkingDate);
}
return firstWorkingDate;
}
function IsWorkingDate(givenDate) {
var givenWeekday = givenDate.getDay();
return (givenWeekday >= 1 && givenWeekday <= 5)
}
function GetNextDate(givenDate) {
var millisecondsPerDay = 86400000;
return new Date(givenDate.valueOf() + millisecondsPerDay);
}
function GetDateString(givenDate) {
var dateString = "";
dateString += givenDate.getYear() + "/";
dateString += (givenDate.getMonth() + 1) + "/";
dateString += givenDate.getDate();
return dateString;
}
function IsMonday(givenDate) {
return givenDate.getDay() == 1;
}
function GetDateAfterGivenDate(givenDate, continuedDays) {
var millisecondsPerDay = 86400000;
return new Date(givenDate.valueOf() + (millisecondsPerDay * continuedDays));
}
function GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan) {
// 周末天数。
var daysPerWeekend = 2;
weekendSpan += Math.floor(workingDays / workingDaysPerWeek);
var lastWeekWorkingDays = workingDays % workingDaysPerWeek;
if (lastWeekWorkingDays == 0) {
weekendSpan -= 1;
}
return (workingDays + (daysPerWeekend * weekendSpan));
}
//-->
</script>
</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" language="javascript">
//入口方法
function GetEndDate() {
var endTime = document.getElementById("endTime");
var startTime = document.getElementById("startTime").value;
var workDays = document.getElementById("workDay").value;
endTime.value =CountDate(startTime, workDays);
} function calculateWorkDays(fromStr, toStr) { //声明两个日期对象
var from = new Date();
var to = new Date();
//转换日期
var fromTime = Date.parse(fromStr);
var toTime = Date.parse(toStr);
from.setTime(fromTime);
from.setHours(0);
from.setMinutes(0);
from.setSeconds(0);
var orgTime = from.getTime(); to.setTime(toTime);
to.setHours(0);
to.setMinutes(0);
to.setSeconds(0); //开始时间大于结束时间
if (from.getTime() > to.getTime()) {
return 0;
} //从周六开始
var sDayofWeek = from.getDay() + 1;
var workdays = 0; //非周末日
from.setDate(from.getDate() - (sDayofWeek % 7));
workdays -= ((sDayofWeek - 2) > 0) ? sDayofWeek - 2 : 0; //计算两个日期之间的天数
var totalDays = (to.getTime() - from.getTime()) / (1000 * 60 * 60 * 24) + 1; workdays += Math.floor(totalDays / 7) * 5; //最后剩余天数
if ((totalDays % 7 - 2) > 0) {
workdays += (totalDays % 7 - 2);
} return workdays;
} function CountDate(startTime, wday) {
var weekday = CheckStartTime(startTime);
var workDays; //最终的工作天数
if (weekday == 0)
workDays = wday - 1;
else if (weekday == 6)
workDays = wday - 2;
else
workDays = wday; //获得最终的工作天数
var totalDays; //总天数
if (workDays > 0) { var weeks = Math.floor(workDays / 5); //共几个星期
var days = workDays - weeks * 5; //扣除整数星期后还有多少天 if (days == 0) {
totalDays = (weeks - 1) * 7 + 5; //工作完成正好是礼拜5
}
else {
totalDays = weeks * 7 + days;
}
if (weekday == 0)
totalDays = totalDays + 1;
else if (weekday == 6)
totalDays = totalDays + 2;
else
totalDays = totalDays;
}
else {
if (weekday == 0)
totalDays = 1;
else if (weekday == 6)
totalDays = wday;
}
var dd = new Date(startTime);
var newdate = new Date();
var newtimems = dd.getTime() + ((totalDays-1) * 24 * 60 * 60 * 1000);
newdate.setTime(newtimems); return newdate.toLocaleDateString();
} function CheckStartTime(startTime) {
var dd = new Date(startTime);
var week = dd.getDay();
return week;
}
</script></head>
<body>
<div>
<div>
startTime <input type="text" id="startTime" value="2010/8/2"
size="10" />
workDay: <input type="text" id="workDay" size="10" />
endTime:<input type="text" id="endTime" value="" size="30" />
<input type="button" name="BT" value="Count" onclick="GetEndDate()" />
</div>
</div>
</body>
</html>
还有一个bug。我的需求是:如果开始的工作日期不管是星期六或者星期天,都从起始日期开始算。并且如果是星期六,后面的星期天也要算是工作日。
结束的日期如果是周末的话,则显示为下周一。并且显示的日期不能向后推。
如:
情况一:起始日期为星期天
2010/8/1 工作 6天 则输出 2010/8/6 (为星期五)2010/8/1 工作 7天 则输出 2010/8/9 (9号为星期一)
情况二:起始日期为星期六
2010/8/7 工作四天 则输出 2010/8/10
2010/8/7 工作一天 则输出 2010/8/8 (8号为星期天)
谢谢各位啊!
4 天是 7,8,9,10,显然 7 号包在其中了!2010/8/7 工作一天 则输出 2010/8/8
1 天是 8,而 7 号被排除在外!lz 不觉得自相矛盾么?!
2010/8/1 工作 6天 则输出 2010/8/6 (为星期五)
2010/8/1 工作 7天 则输出 2010/8/9 (9号为星期一)情况二:起始日期为星期六
2010/8/7 工作一天 则输出 2010/8/7 (7号为星期六)
2010/8/7 工作两天 则输出 2010/8/8 (8号为星期天)俺把代码修改了一下,以上两种情况都已测试通过L@_@K
<!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>javascript.Date.CalculateDepartureDate.html</title>
<meta name="generator" content="editplus" />
<meta name="author" content="[email protected]" />
<meta name="keywords" content="" />
<meta name="description" content="" />
</head>
<body>
<script type="text/javascript">
<!--
/*
需求描述:给定任意日期作为入职日期,工作N个工作日之后,计算离职日期?
注:
“工作日”为周一至周五,不包含周六、日。
“首个工作日”从注册日期之后算起,即不包含注册日期在内。
“离职日期”为最后一个工作日的后一天。如:
入职日期:2010/8/1
工作天数:10
离职日期:2010/8/14
*/// 入职日期
var entryDate = ParseDate("2010/8/1");
// 工作天数
var workingDays = 7;
// 离职日期
var departureDate = GetDepartureDate(entryDate, workingDays);document.write(GetDateString(departureDate));function GetDepartureDate(entryDate, workingDays) {
// 每周工作天数。
var workingDaysPerWeek = 5;
// 离职日期
var departureDate = null;
// 首个工作日
//var firstWorkingDate = GetFirstWokingDate(entryDate); // 入职日期当日算工作日。
var firstWorkingDate = entryDate; // 周末跨度数
var weekendSpan = 0;
// 第一周工作天数。
var firstWeekWorkingDays = 0;
// 最后一周工作天数。
var lastWeekWorkingDays = 0;
// 从首个工作日之后,到离职日期之间持续的天数(包括离职日期在内)。
var continuedDaysAfterFirstWorkingDate = 0; if (IsMonday(firstWorkingDate)) {
continuedDaysAfterFirstWorkingDate = GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan);
}
else if (IsWeekend(firstWorkingDate)) {
var overtimeDays = 0;
switch (firstWorkingDate.getDay()) {
// Sunday
case 0:
overtimeDays = 1;
break;
// Saturday
case 6:
overtimeDays = 2;
break;
}
if (workingDays > overtimeDays) {
var normalWorkingDays = workingDays-overtimeDays;
continuedDaysAfterFirstWorkingDate = overtimeDays + GetContinuedDays(normalWorkingDays, workingDaysPerWeek, weekendSpan);
}
else {
continuedDaysAfterFirstWorkingDate = workingDays;
}
}
else {
firstWeekWorkingDays = workingDaysPerWeek - firstWorkingDate.getDay() + 1;
if (firstWeekWorkingDays >= workingDays) {
continuedDaysAfterFirstWorkingDate = workingDays;
} else {
weekendSpan += 1;
workingDays -= firstWeekWorkingDays;
continuedDaysAfterFirstWorkingDate = firstWeekWorkingDays + GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan);
}
} // 入职日期当日算工作日。
continuedDaysAfterFirstWorkingDate--; departureDate = GetDateAfterGivenDate(firstWorkingDate, continuedDaysAfterFirstWorkingDate); return departureDate;
}
function ParseDate(yyyyMMddString) {
return new Date(Date.parse(yyyyMMddString));
}
function GetFirstWokingDate(entryDate) {
var firstWorkingDate = GetNextDate(entryDate); while (!IsWorkingDate(firstWorkingDate)) {
firstWorkingDate = GetNextDate(firstWorkingDate);
}
return firstWorkingDate;
}
function IsWorkingDate(givenDate) {
var givenWeekday = givenDate.getDay();
return (givenWeekday >= 1 && givenWeekday <= 5)
}
function GetNextDate(givenDate) {
var millisecondsPerDay = 86400000;
return new Date(givenDate.valueOf() + millisecondsPerDay);
}
function GetDateString(givenDate) {
var dateString = "";
dateString += givenDate.getYear() + "/";
dateString += (givenDate.getMonth() + 1) + "/";
dateString += givenDate.getDate();
return dateString;
}
function IsMonday(givenDate) {
return givenDate.getDay() == 1;
}
function GetDateAfterGivenDate(givenDate, continuedDays) {
var millisecondsPerDay = 86400000;
return new Date(givenDate.valueOf() + (millisecondsPerDay * continuedDays));
}
function GetContinuedDays(workingDays, workingDaysPerWeek, weekendSpan) {
// 周末天数。
var daysPerWeekend = 2;
weekendSpan += Math.floor(workingDays / workingDaysPerWeek);
var lastWeekWorkingDays = workingDays % workingDaysPerWeek;
if (lastWeekWorkingDays == 0) {
weekendSpan -= 1;
}
return (workingDays + (daysPerWeekend * weekendSpan));
}
function IsWeekend(givenDate) {
return givenDate.getDay() == 0 || givenDate.getDay() == 6;
}
//-->
</script>
</body>
</html>