Javascript或PHP创建新日期,但只计算营业时间
我想创建一个脚本来计算基于今天的日期+X小时数的新日期是否会超过某个日期或更早。但是,我只想考虑营业时间(上午8点到晚上18点)和工作日(不是星期六或星期日)。 例:如果我的一天只有10个小时,而我不算周六或周日,那么今天的日期-2015年12月11日+30小时将产生哪个日期 我有一个脚本来做这件事,但它非常不可靠。有人有简单的解决方案吗?我在网上找不到任何东西Javascript或PHP创建新日期,但只计算营业时间,javascript,php,date,Javascript,Php,Date,我想创建一个脚本来计算基于今天的日期+X小时数的新日期是否会超过某个日期或更早。但是,我只想考虑营业时间(上午8点到晚上18点)和工作日(不是星期六或星期日)。 例:如果我的一天只有10个小时,而我不算周六或周日,那么今天的日期-2015年12月11日+30小时将产生哪个日期 我有一个脚本来做这件事,但它非常不可靠。有人有简单的解决方案吗?我在网上找不到任何东西 function Diferenca($data1, $data2, $tipo){ if($data2==""){ $dat
function Diferenca($data1, $data2, $tipo){
if($data2==""){
$data2 = date("d/m/Y H:i");
}
if($tipo==""){
$tipo = "h";
}
for($i=1;$i<=2;$i++){
${"dia".$i} = substr(${"data".$i},0,2);
${"mes".$i} = substr(${"data".$i},3,2);
${"ano".$i} = substr(${"data".$i},6,4);
${"horas".$i} = substr(${"data".$i},11,2);
${"minutos".$i} = substr(${"data".$i},14,2);
}
$segundos = mktime($horas2,$minutos2,0,$mes2,$dia2,$ano2) - mktime($horas1,$minutos1,0,$mes1,$dia1,$ano1);
switch($tipo){
case "m": $difere = $segundos/60; break;
case "H": $difere = $segundos/3600; break;
case "h": $difere = round($segundos/3600); break;
case "D": $difere = $segundos/86400; break;
case "d": $difere = round($segundos/86400); break;
case "s": $difere = $segundos; break;
}
return $difere; }
function dec_Data($data){
$dia = substr($data, 8, 2);
$mes = substr($data, 5, 2);
$ano = substr($data, 0, 4);
$hr = substr($data, 11, 2);
$m = substr($data, 14, 2);
$data_retorno = $dia.'/'.$mes.'/'.$ano." ".$hr.":".$m;
return $data_retorno; }
if($data_cadastro_enc != '0000-00-00' and $data_cadastro_enc != '' and $sla_atend > 0 and $_POST["hora_abertura"] > 0 and $_POST["ativ_realizada"] != 'Projeto'){
$data_cadastro_atend = $data_cadastro_enc." ".$_POST["hora_abertura"];
$ano_data_cadastro_atend = substr($data_cadastro_atend, 0, 4);
$mes_data_cadastro_atend = substr($data_cadastro_atend, 5, 2);
$dia_data_cadastro_atend = substr($data_cadastro_atend, 8, 2);
$hr_data_cadastro_atend = substr($data_cadastro_atend, 11, 2);
$mn_data_cadastro_atend = substr($data_cadastro_atend, 14, 2);
$timestamp_atend = mktime($hr_data_cadastro_atend + $sla_atend, $mn_data_cadastro_atend, 0, $mes_data_cadastro_atend, $dia_data_cadastro_atend, $ano_data_cadastro_atend);
$diaSemana = getDate($timestamp_atend);
$diaValor = $diaSemana[weekday];
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
$ano_nova_data_atend = substr($nova_data_atend, 0, 4);
$mes_nova_data_atend = substr($nova_data_atend, 5, 2);
$dia_nova_data_atend = substr($nova_data_atend, 8, 2);
$hr_nova_data_atend = substr($nova_data_atend, 11, 2);
$mn_nova_data_atend = substr($nova_data_atend, 14, 2);
switch ($diaValor){
case "Saturday": $timestamp_atend = mktime($hr_nova_data_atend, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 2, $ano_nova_data_atend);
break;
case "Sunday": $timestamp_atend = mktime($hr_nova_data_atend, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 1, $ano_nova_data_atend);
break;
default: $timestamp_atend = mktime($hr_nova_data_atend, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
}
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
$val_hora_atend = $data_cadastro_enc." 18:00";
while($nova_data_atend > $val_hora_atend){
$data_dif = dec_Data($nova_data_atend);
$data_dif_com = dec_Data($val_hora_atend);
$agora = Diferenca($data_dif_com, $data_dif, "m");
$soma = $agora + 840;
$ano_data_cadastro_atend_com = substr($val_hora_atend, 0, 4);
$mes_data_cadastro_atend_com = substr($val_hora_atend, 5, 2);
$dia_data_cadastro_atend_com = substr($val_hora_atend, 8, 2);
$hr_data_cadastro_atend_com = substr($val_hora_atend, 11, 2);
$mn_data_cadastro_atend_com = substr($val_hora_atend, 14, 2);
$timestamp_atend = mktime($hr_data_cadastro_atend_com, $mn_data_cadastro_atend_com + $soma, 0, $mes_data_cadastro_atend_com, $dia_data_cadastro_atend_com, $ano_data_cadastro_atend_com);
$diaSemana = getDate($timestamp_atend);
$diaValor = $diaSemana[weekday];
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
$ano_nova_data_atend = substr($nova_data_atend, 0, 4);
$mes_nova_data_atend = substr($nova_data_atend, 5, 2);
$dia_nova_data_atend = substr($nova_data_atend, 8, 2);
$hr_nova_data_atend = substr($nova_data_atend, 11, 2);
$mn_nova_data_atend = substr($nova_data_atend, 14, 2);
switch($diaValor){
case "Saturday": $timestamp_atend = mktime($hr_nova_data_atend, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 2, $ano_nova_data_atend);
break;
case "Sunday": $timestamp_atend = mktime($hr_nova_data_atend, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 1, $ano_nova_data_atend);
break;
default: $timestamp_atend = mktime($hr_nova_data_atend, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
}
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
$val_hora_atend = substr($nova_data_atend, 0, 10)." 18:00";
}
$hr_nova_data = substr($nova_data_atend, 11, 2);
if($hr_nova_data == 0){
$ano_nova_data_atend = substr($nova_data_atend, 0, 4);
$mes_nova_data_atend = substr($nova_data_atend, 5, 2);
$dia_nova_data_atend = substr($nova_data_atend, 8, 2);
$hr_nova_data_atend = substr($nova_data_atend, 11, 2);
$mn_nova_data_atend = substr($nova_data_atend, 14, 2);
$timestamp_atend = mktime($hr_nova_data_atend + 14, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
} else if($hr_nova_data == 1) {
$ano_nova_data_atend = substr($nova_data_atend, 0, 4);
$mes_nova_data_atend = substr($nova_data_atend, 5, 2);
$dia_nova_data_atend = substr($nova_data_atend, 8, 2);
$hr_nova_data_atend = substr($nova_data_atend, 11, 2);
$mn_nova_data_atend = substr($nova_data_atend, 14, 2);
$timestamp_atend = mktime($hr_nova_data_atend + 15, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
} else if($hr_nova_data == 2) {
$ano_nova_data_atend = substr($nova_data_atend, 0, 4);
$mes_nova_data_atend = substr($nova_data_atend, 5, 2);
$dia_nova_data_atend = substr($nova_data_atend, 8, 2);
$hr_nova_data_atend = substr($nova_data_atend, 11, 2);
$mn_nova_data_atend = substr($nova_data_atend, 14, 2);
$timestamp_atend = mktime($hr_nova_data_atend + 16, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
} else if($hr_nova_data == 3) {
$ano_nova_data_atend = substr($nova_data_atend, 0, 4);
$mes_nova_data_atend = substr($nova_data_atend, 5, 2);
$dia_nova_data_atend = substr($nova_data_atend, 8, 2);
$hr_nova_data_atend = substr($nova_data_atend, 11, 2);
$mn_nova_data_atend = substr($nova_data_atend, 14, 2);
$timestamp_atend = mktime($hr_nova_data_atend + 17, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
} else if($hr_nova_data == 4) {
$ano_nova_data_atend = substr($nova_data_atend, 0, 4);
$mes_nova_data_atend = substr($nova_data_atend, 5, 2);
$dia_nova_data_atend = substr($nova_data_atend, 8, 2);
$hr_nova_data_atend = substr($nova_data_atend, 11, 2);
$mn_nova_data_atend = substr($nova_data_atend, 14, 2);
$timestamp_atend = mktime($hr_nova_data_atend + 32, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
$diaSemana = getDate($timestamp_atend);
$diaValor = $diaSemana[weekday];
switch($diaValor){
case "Saturday": $timestamp_atend = mktime($hr_nova_data_atend + 32, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 2, $ano_nova_data_atend);
break;
case "Sunday": $timestamp_atend = mktime($hr_nova_data_atend + 32, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 1, $ano_nova_data_atend);
break;
default: $timestamp_atend = mktime($hr_nova_data_atend + 32, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
}
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
} else if($hr_nova_data == 5) {
$ano_nova_data_atend = substr($nova_data_atend, 0, 4);
$mes_nova_data_atend = substr($nova_data_atend, 5, 2);
$dia_nova_data_atend = substr($nova_data_atend, 8, 2);
$hr_nova_data_atend = substr($nova_data_atend, 11, 2);
$mn_nova_data_atend = substr($nova_data_atend, 14, 2);
$timestamp_atend = mktime($hr_nova_data_atend + 33, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
$diaSemana = getDate($timestamp_atend);
$diaValor = $diaSemana[weekday];
switch($diaValor){
case "Saturday": $timestamp_atend = mktime($hr_nova_data_atend + 33, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 2, $ano_nova_data_atend);
break;
case "Sunday": $timestamp_atend = mktime($hr_nova_data_atend + 33, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 1, $ano_nova_data_atend);
break;
default: $timestamp_atend = mktime($hr_nova_data_atend + 33, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
}
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
} else if($hr_nova_data == 6) {
$ano_nova_data_atend = substr($nova_data_atend, 0, 4);
$mes_nova_data_atend = substr($nova_data_atend, 5, 2);
$dia_nova_data_atend = substr($nova_data_atend, 8, 2);
$hr_nova_data_atend = substr($nova_data_atend, 11, 2);
$mn_nova_data_atend = substr($nova_data_atend, 14, 2);
$timestamp_atend = mktime($hr_nova_data_atend + 34, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
$diaSemana = getDate($timestamp_atend);
$diaValor = $diaSemana[weekday];
switch($diaValor){
case "Saturday": $timestamp_atend = mktime($hr_nova_data_atend + 34, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 2, $ano_nova_data_atend);
break;
case "Sunday": $timestamp_atend = mktime($hr_nova_data_atend + 34, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 1, $ano_nova_data_atend);
break;
default: $timestamp_atend = mktime($hr_nova_data_atend + 34, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
}
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
} else if($hr_nova_data == 7) {
$ano_nova_data_atend = substr($nova_data_atend, 0, 4);
$mes_nova_data_atend = substr($nova_data_atend, 5, 2);
$dia_nova_data_atend = substr($nova_data_atend, 8, 2);
$hr_nova_data_atend = substr($nova_data_atend, 11, 2);
$mn_nova_data_atend = substr($nova_data_atend, 14, 2);
$timestamp_atend = mktime($hr_nova_data_atend + 35, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
$diaSemana = getDate($timestamp_atend);
$diaValor = $diaSemana[weekday];
switch($diaValor){
case "Saturday": $timestamp_atend = mktime($hr_nova_data_atend + 35, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 2, $ano_nova_data_atend);
break;
case "Sunday": $timestamp_atend = mktime($hr_nova_data_atend + 35, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend + 1, $ano_nova_data_atend);
break;
default: $timestamp_atend = mktime($hr_nova_data_atend + 35, $mn_nova_data_atend, 0, $mes_nova_data_atend, $dia_nova_data_atend, $ano_nova_data_atend);
}
$nova_data_atend = date("Y-m-d H:i", $timestamp_atend);
}
$sla_atend_data = $nova_data_atend;
}
函数差异($data1、$data2、$tipo){
如果($data2==“”){
$data2=日期(“d/m/Y H:i”);
}
如果($tipo==“”){
$tipo=“h”;
}
对于($i=1;$i 0和$u POST[“hora_abertura”]>0和$u POST[“ativ_realizada”]!='Projeto'){
$data\u cadastro\u atend=$data\u cadastro\u enc.“$\u POST[“hora\u abertura”];
$ano_data_cadastro_atend=substr($data_cadastro_atend,0,4);
$mes\U data\U cadastro\U atend=substr($data\U cadastro\U atend,5,2);
$dia_data_cadastro_atend=substr($data_cadastro_atend,8,2);
$hr\u data\u cadastro\u atend=substr($data\u cadastro\u atend,11,2);
$mn_data_cadastro_atend=substr($data_cadastro_atend,14,2);
$timestamp\u atend=mktime($hr\u data\u cadastro\u atend+$sla\u atend,$mn\u data\u cadastro\u atend,0,$mes\u data\u cadastro\u atend,$dia\u data\u cadastro\u atend,$ano\u data\u cadastro\u atend);
$diaSemana=getDate($timestamp\u-atend);
$diaValor=$diaSemana[工作日];
$nova_data_atend=日期(“Y-m-d H:i”,$timestamp_atend);
$ano_nova_data_atend=substr($nova_data_atend,0,4);
$mes_nova_data_atend=substr($nova_data_atend,5,2);
$dia_nova_data_atend=substr($nova_data_atend,8,2);
$hr_nova_data_atend=substr($nova_data_atend,11,2);
$mn_nova_data_atend=substr($nova_data_atend,14,2);
开关($diaValor){
案例“星期六”:$timestamp\u atend=mktime($hr\u nova\u data\u atend,$mn\u nova\u data\u atend,0,$mes\u nova\u data\u atend,$dia\u nova\u data\u atend+2,$ano\u nova\u data\u atend);
打破
案例“星期日”:$timestamp\u atend=mktime($hr\u nova\u data\u atend,$mn\u nova\u data\u atend,0,$mes\u nova\u data\u atend,$dia\u nova\u data\u atend+1,$ano\u nova\u data\u atend);
打破
默认值:$timestamp_atend=mktime($hr_nova_data_atend,$mn_nova_data_atend,0,$mes_nova_data_atend,$dia_nova_data_atend,$ano_nova_data_atend);
}
$nova_data_atend=日期(“Y-m-d H:i”,$timestamp_atend);
$val_hora_atend=$data_cadastro_enc.“18:00”;
而($nova\u data\u atend>$val\u hora\u atend){
$data\u dif=dec\u data($nova\u data\u atend);
$data\u dif\u com=dec\u data($val\u hora\u atend);
$agora=diference($data_dif_com,$data_dif,“m”);
$soma=$agora+840;
$ano_data_cadastro_atend_com=substr($val_hora_atend,0,4);
$mes_data_cadastro_atend_com=substr($val_hora_atend,5,2);
$dia_data_cadastro_atend_com=substr($val_hora_atend,8,2);
$hr_data_cadastro_atend_com=substr($val_hora_atend,11,2);
$mn_data_cadastro_atend_com=substr($val_hora_atend,14,2);
$timestamp_atend=mktime($hr_data_cadastro_atend_com、$mn_data_cadastro_atend_com+$soma,0、$mes_data_cadastro_atend_com、$dia_data_cadastro_atend_com、$ano_data_cadastro atend_com);
$diaSemana=getDate($timestamp\u-atend);
$diaValor=$diaSemana[工作日];
$nova_data_atend=日期(“Y-m-d H:i”,$timestamp_atend);
$ano_nova_data_atend=substr($nova_data_atend,0,4);
$mes_nova_data_atend=substr($nova_data_atend,5,2);
$dia_nova_data_atend=substr($nova_data_atend,8,2);
$hr_nova_data_atend=substr($nova_data_atend,11,2);
$mn_nova_data_atend=substr($nova_data_atend,14,2);
开关($diaValor){
案例“星期六”:$timestamp\u atend=mktime($hr\u nova\u data\u atend,$mn\u nova\u data\u atend,0,$mes\u nova\u data\u atend,$dia\u nova\u data\u atend+2,$ano\u nova\u data\u atend);
打破
案例“星期日”:$timestamp\u atend=mktime($hr\u nova\u data\u atend,$mn\u nova\u data\u atend,0,$mes\u nova\u data\u atend,$dia\u nova\u data\u atend+1,$ano\u nova\u data\u atend);
打破
默认值:$timestamp_atend=mktime($hr_nova_data_atend,$mn_nova_data_atend,0,$mes_nova_data_atend,$dia_nova_data_atend,$ano_nova_data_atend);
}
$nova_data_atend=日期(“Y-m-d H:i”,$timestamp_atend);
$val_hora_atend=substr($nova_data_atend,0,10)。“18:00”;
}
$hr_nova_data=substr($nova_data_atend,11,2);
如果($hr\u nova\u data==0){
$ano_nova_data_atend=substr($nova_data_atend,0,4);
$mes_nova_data_atend=substr($nova_data_atend,5,2);
$dia_nova_data_atend=substr($nova_data_atend,8,2);
$hr_nova_data_atend=substr($nova_data_atend,11,2);
$mn_nova_data_atend=substr($nova_data_atend,14,2);
$timestamp_atend=mktime($hr_nova_data_atend+14,$mn_nova_data_atend,0,$mes_nova_data_atend,$dia_nova_data_atend,$ano_nova_data_atend);
$nova_data_atend=日期(“Y-m-d H:i”,$timestamp_atend);
}否则如果($hr\u nova\u data==1){
$ano_nova_data_atend=substr($nova_data_atend,0,4);
$mes_nova_data_atend=substr($nova_data_atend,5,2);
$dia_nova_data_atend=substr($nova_data_atend,8,2);
$hr_nova_data_atend=substr($nova_data_atend,11,2);
$mn_nova_data_atend=substr($nova_data_atend,14,2);
$timestamp_atend=mktime($hr_nova_data_atend+15,$mn_nova_data_atend,0,$mes_nova_data_atend,$dia_nova_data_atend,$ano_nova_data_atend);
$nova_data_atend=日期(“Y-m-d H:i”,$timestamp_atend);
}否则如果($hr\u nova\u data==2){
$ano_nova_data_atend=substr($nova_data_atend,0,4);
$mes_nova_data_atend=substr($nova_data_atend,5,2);
$dia_nova_data_atend=substr($nova_data_atend,8,2);
$hr_nova_data_atend=substr($nova_data_atend,11,2);
$mn_nova_data_atend=substr($nova_data_atend,14,2);
$
var currentDate = new Date(); // new Date object with current date/time
currentDate; // "Fri Dec 11 2015 09:45:39 GMT-0800 (PST)"
currentDate.getHours(); // returns hours past midnight, in this case '9'
currentDate.getMinutes(); // returns minutes past last whole hour, in this case 45
currentDate.getDay(); // returns a number 1-7 representing Monday through Sunday
// creating a future date
var futureDate = new Date(2015, 12, 14, 9, 30); // 12/14/2015 at 9:30 AM
// the format is (year, month, date, hour, minute)
function getDateCompleted($date, $hours, $hoursPerDay) {
if ($hoursPerDay == 0) {
// Will never reach and prevent division by zero
return null;
}
$daysToComplete = ceil((float)$hours / $hoursPerDay);
$days = 0;
$time =strtotime($date);
while ($days < $daysToComplete) {
// Check for weekend
if (!(date('N', $date) >= 6)) {
$current = $time;
$days++;
}
$time = strtotime("+1 day", $time);
}
return date("Y-m-d", $current);
}
echo getDateCompleted("11/12/2015", 30, 10);
function foo(start_time, plus_hours) {
var time = new Date(+start_time),
day;
// rewind to the start of the hour
time.setMinutes(0, 0, 0);
// then
if (time.getHours() < 8) { // if before work day
time.setHours(8); // fast forward to start of work hours
}
if (time.getHours() >= 18) { // if after work day
time.setDate(time.getDate() + 1); // fast forward to tomorrow
time.setHours(8); // start of work hours
}
if ([0, 6].indexOf(time.getDay()) !== -1) { // if it is weekend
day = (time.getDay() && 2) || 1; // (no setDay method)
time.setDate(time.getDate() + day); // fast foward to monday
time.setHours(8); // start of work hours
}
// now convert plus_hours into day-length equivalents (i.e. add 14 hours for each 10 hours)
plus_hours = plus_hours + (plus_hours - Math.floor(plus_hours % (18 - 8))) * (24 - (18 - 8)) / (18 - 8);
// now work out how many hours we have until saturday
day = time.getDay();
day = (6 - day) * 24;
day = day - time.getHours();
// then
if (plus_hours > day) { // if we are going to cross into future weeks
// add 48 hours for each week (i.e. each 5 days)
plus_hours = plus_hours - day;
plus_hours = (plus_hours - Math.floor(plus_hours % (5 * 24))) * (2 * 24) / 5;
plus_hours = plus_hours + day + 2 * 24;
}
return new Date(+time + plus_hours * 60 * 60 * 1000);
}