首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算“下一个工作日”的时间截止值

计算“下一个工作日”的时间截止值
EN

Stack Overflow用户
提问于 2019-04-04 03:06:02
回答 2查看 218关注 0票数 1

我正在尝试创建一个交付时间估计器,根据今天的日期,它将显示需要多少天才能收到一个项目。

使用它一切都运行得很好。我被困在最后的部分是如何设置日期,以便每天下午2点太平洋时间,它将日期更改为第二天。

现在,我已将其设置为使用太平洋时间。这只是一个简单的问题,让日期更改在订单截止时间下午2点到第二天。

我想过简单地更改时区,但不确定这种方法是否会考虑夏令时的因素。

我已经添加了下面正在使用的代码:

代码语言:javascript
复制
<?php
if ((strlen(ini_get('date.timezone')) < 1) && function_exists('date_default_timezone_set')) {
    date_default_timezone_set('America/Los_Angeles');
}

function getNextMondayDate($date) {
    $day = date('w', $date);
    if ($day==0) {
        $ret = strtotime("+1 day", $date);
    } else if ($day==6) {
        $ret = strtotime("+2 day", $date);
    } else {
        $ret = strtotime("now", $date);
    }
    return $ret;
}

function businessDays($days, $time) {       
    for ($i=0; $i<$days; $i++) {
        $time = strtotime('+1 day', $time);
        $day = date('w',$time);
        if ($day==0) {
            $time = strtotime('+1 day', $time);
        } else if ($day==6) {
            $time = strtotime('+2 day', $time);
        }
    }
    return $time;
}

$date =  date("l, F jS");
$dateStart = getNextMondayDate(strtotime("now"));

  if (date('w')==6 || date('w')==0){
// If the order is placed on Saturday or Sunday...
// THe numbers you see below are measured in days.  In the example below
// The delivery times for standard shipping are from 2-4 days from today
    $dateStandardMinMG = date("l, F jS",getNextMondayDate(businessDays(2,$dateStart)));
    $dateStandardMaxMG = date("l, F jS",getNextMondayDate(businessDays(4,$dateStart)));
    $dateExpressMinMG = date("l, F jS",getNextMondayDate(businessDays(0,$dateStart)));
    $dateExpressMaxMG = date("l, F jS",getNextMondayDate(businessDays(1,$dateStart)));
}else{
// Otherwise, use these estimates
    $dateStandardMinMG = date("l, F jS",getNextMondayDate(businessDays(3,$dateStart)));
    $dateStandardMaxMG = date("l, F jS",getNextMondayDate(businessDays(5,$dateStart)));
    $dateExpressMinMG = date("l, F jS",getNextMondayDate(businessDays(1,$dateStart)));
    $dateExpressMaxMG = date("l, F jS",getNextMondayDate(businessDays(2,$dateStart)));
  }
?>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-04 04:51:28

因此,您正在寻找一个函数来返回与当前日期相距一定天数的下一个工作日--除非它是在周末或下午2点之后,在这种情况下,您希望下一个工作日与下一个工作日相距一定天数?应该是这样的。我把所有的东西都摊开了,所以应该很容易理解。

代码语言:javascript
复制
function getDeliveryDay(int $days, int $date = null):int {
    if ($date === null) {
        $date = time();
    }
    $base = "now";
    if (date("H", $date) >= 14) {
        // if it's late, calculate from tomorrow
        $days++;
    }
    if (in_array(date("w", $date), [0, 6])) {
        // if it's a weekend, calculate from monday
        $base = "next monday";
    }
    for ($i = 0; $i <= $days; $i++) {
        // make sure delivery day isn't Saturday or Sunday
        // don't count those days in processing time either
        $result = strtotime("$base +$i days", $date);
        $w = date("w", $result);
        if (in_array($w, [0, 6])) $days++;
    }
    return $result;
}

测试(周四3:00 ):

代码语言:javascript
复制
echo date("l, F jS", getDeliveryDay(0)) . "\n"; // should be Friday
echo date("l, F jS", getDeliveryDay(1)) . "\n"; // should be Monday
echo date("l, F jS", getDeliveryDay(2)) . "\n"; // should be Tuesday
echo date("l, F jS", getDeliveryDay(3)) . "\n"; // should be Wednesday
echo date("l, F jS", getDeliveryDay(4)) . "\n"; // should be Thursday
echo date("l, F jS", getDeliveryDay(5)) . "\n"; // should be Friday

输出:

代码语言:javascript
复制
Friday, April 5th
Monday, April 8th
Tuesday, April 9th
Wednesday, April 10th
Thursday, April 11th
Friday, April 12th

在您的原始代码中:

代码语言:javascript
复制
$dateStandardMinMG = date("l, F jS", getDeliveryDay(2));
$dateStandardMaxMG = date("l, F jS", getDeliveryDay(4));
$dateExpressMinMG = date("l, F jS", getDeliveryDay(0));
$dateExpressMaxMG = date("l, F jS", getDeliveryDay(1));
票数 1
EN

Stack Overflow用户

发布于 2019-04-04 03:57:19

如果我理解正确的话,如果输入时间超过下午2点,您想在计算中加上+1天吗?为了与您的方法保持一致,我将为时间添加一个日期格式,并像您对工作日所做的那样遍历它

因为businessDays()计算的是交付时间,所以我认为它正好适合这里

代码语言:javascript
复制
function businessDays($days, $time) {
    // Past 2 PM check should be outside the for loop
    $hours = date('G', $time);
    $weekend = date('w',$time);
    if ($hours > 14 AND $weekend != 0 AND $weekend !=6) {
        $time = strtotime('+1 day', $time); 
    }  
    for ($i=0; $i<$days; $i++) {
        $time = strtotime('+1 day', $time);
        $day = date('w',$time);
        if ($day==0) {
            $time = strtotime('+1 day', $time);
        } else if ($day==6) {
            $time = strtotime('+2 day', $time);
        }
    }
    return $time;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55502560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档