【问题标题】:PHP - Exclude all non-business hours / days from time differencePHP - 从时差中排除所有非营业时间/天
【发布时间】:2013-02-02 22:24:02
【问题描述】:

我有一张表格,显示了自提出工作以来的时间。

// These are unix epoch times...
$raised = 1360947684;
$now = 1361192598;
$difference = 244914;

$difference 需要排除工作时间以外的任何时间(例如,9-5 和周末)。

我该如何解决这个问题?

【问题讨论】:

    标签: php time timestamp


    【解决方案1】:

    你要做的就是数字 3。

    1. 您取开始日期并计算这一天的休息时间(如果是工作日)
    2. 您选择结束日期并计算这一天的时间,然后
    3. 您将中间的天数乘以您的营业时间(只是那些,即营业日)

    有了that,你就完成了。

    找到一个附加的小类,它可以做这些事情。注意没有错误处理、时区设置、夏令时……

    输入:

    • 开始日期
    • 结束日期

    输出:

    • 以秒为单位的差异时间

    可调常数:

    • 营业时间
    • 非工作日

    【讨论】:

      【解决方案2】:

      非常糟糕的主意,但我别无选择,因为我使用的是 php 5.2

      <?php
      date_default_timezone_set('Asia/Seoul');
      
      $start = 1611564957;
      $end = 1611670000;
      $res = 0;
      for($i = $start; $i<$end; $i++){
      
          $h = date("H", $i);
          if($h >= 9 && $h < 18){
              //echo date("Y-m-d H:i:s", $i) . "<br>";
              $res = $res + 1;
          }
      }
      echo $res;
      

      【讨论】:

        【解决方案3】:

        使用DateTime

        为此使用 UNIX 时间有点荒谬,您必须从字面上重新制作 DateTime
        查找relative formats,您可以在其中指定当天的小时,例如

        $date = new DateTime($raised);
        $business_start = new DateTime("09:00"); // 9am today
        $business_end = new DateTime("17:00"); // 5pm today
        

        剩下的就交给你了。

        哦,你可以使用 DateInterval 值而不是开始/结束 P8H“周期 8 小时”

        直接使用时间戳的问题在于您将上下文分配给秒计数器。您必须从要排除的时间开始向后工作,并事先计算出它们的时间戳。您可能想尝试重新设计您何时提出工作的存储。也许为它设置一个到期时间?

        【讨论】:

        • 感谢您的回复。我仍然不完全理解这一点。我是否必须手动减去非营业时间的时间?我真的不知道该怎么做。
        猜你喜欢
        • 2020-03-21
        • 2021-07-15
        • 2020-07-10
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        相关资源
        最近更新 更多