【问题标题】:Given two dates what is the best way of finding the number of weekdays in PHP?给定两个日期,在 PHP 中查找工作日数的最佳方法是什么?
【发布时间】:2008-09-17 06:28:36
【问题描述】:

标题几乎是不言自明的。给定两个日期,使用 PHP 查找工作日天数的最佳方法是什么?工作日为周一至周五。

例如,我如何知道31/08/200813/09/2008 之间有10 个工作日?

【问题讨论】:

    标签: php date


    【解决方案1】:
            $datefrom = strtotime($datefrom, 0);
            $dateto = strtotime($dateto, 0);
    
            $difference = $dateto - $datefrom;
    
            $days_difference = floor($difference / 86400);
            $weeks_difference = floor($days_difference / 7); // Complete weeks
    
            $first_day = date("w", $datefrom);
            $days_remainder = floor($days_difference % 7);
    
            $odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
            if ($odd_days > 7) { // Sunday
                $days_remainder--;
            }
            if ($odd_days > 6) { // Saturday
                $days_remainder--;
            }
    
            $datediff = ($weeks_difference * 5) + $days_remainder;
    

    从这里:http://www.addedbytes.com/php/php-datediff-function/

    【讨论】:

      【解决方案2】:

      如果您要创建发票系统,则必须考虑银行假期、复活节等。计算起来并不简单。

      我见过的最好的解决方案是预先生成一个包含天数及其类型的表到 SQL 数据库(每天行 = 每年 365 行),然后使用适当的选择(WHERE 子句)执行简单的计数查询。

      您可以在 Joe Celko 的 Thinking in Sets: Auxiliary, Temporal, and Virtual Tables in SQL中找到该解决方案的完整描述

      【讨论】:

      • 哇,这是解决该问题的一个相当独特的解决方案。它不仅可以更新,而且还可以很好地扩展。惊人的。向提出这一点的人致敬。我见过无数的方法和算法都失败了,但这听起来很可靠。
      【解决方案3】:

      一种方法是使用 strtotime(...) 将日期转换为 unix 时间戳,减去结果并使用 86400 (24*60*60) 进行除法:

      $dif_in_seconds = abs(strtotime($a) - strtotime($b));
      $daysbetween = $dif_in_seconds / 86400;
      

      ETA:哦..你的意思是周一至周五的工作日..一开始没看到..

      【讨论】:

      • 这会引入 unix 时间戳带来的所有问题。如果你有一个 1970 年之前的约会对象会怎样?
      • 该解决方案在某些问题领域是完全可行的。当然,原则上你是对的。尽管我怀疑对于今天编写的大多数程序,您不会担心 1970 年之前日期范围的工作日差异。
      • erlando,可能不是。我对 unix 时间戳有点害羞,并且这些天像瘟疫一样避免它们,因为我已经看到当它们被用来表示不应该发生的事情时会发生什么。喜欢日期。创建时区问题。我认为时间是邪恶的,我们应该假装它不存在。 :-p
      • 时间确实是邪恶的.. :-) 我实际上同意你的观点,我所有的持久日期(即在数据库中)都是日期时间。但是当你有“简单”的计算时(没有简单的日期计算......)时间戳可能是要走的路...... :-)
      【解决方案4】:

      最好的方法是遍历给定日期范围内的所有日期,并获取每个日期的星期几。如果是工作日,请增加某个计数器。在该过程结束时,您将获得工作日数。

      PHP 函数 mktime() 和 date()(用于处理 UNIX 时间戳)是您的朋友。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 2011-10-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-24
        相关资源
        最近更新 更多