1

我有两个号码;Unix Epoch 格式的日期。

假设我有两个 Unix 纪元时间戳:

1349422200 = 05/10/2012 08:30
1350489600 = 17/10/2012 17:00

我能够找出两个日期/时间之间有多少天,没问题。我希望能够计算出有多少天是周六或周日(非工作日)。我确信必须有一个简单的方法来解决这个问题,但如果不做大量的 for() 循环,我一辈子都无法弄清楚。

非常感谢任何帮助。

4

2 回答 2

2

更具体地定义周末。您是否只想包括整个周末(周六和周日的整个 48 小时)?或者包含周五晚上/周六早上午夜的任何时间范围是否算作周末?半个周末算一半,还是四舍五入到最接近的整数?

任何状况之下:

  1. 弄清楚周末的组成
  2. 查找您时间范围内的第一个和最后一个周末
  3. 求它们之间的时间差,以天为单位,然后除以 7

编辑:您正在寻找确切的周末时间,没有四舍五入。

首先,将时间跨度分成 3 个块:

  1. 从范围开始到第一个可能的星期一早上午夜的所有内容
  2. 从上一个区块结束到最后一个可能的星期一早上午夜的所有内容
  3. 从前一个块的末尾到范围末尾的所有内容

然后计算每个区块的周末数量,并将它们相加。

  1. 如果第一个块的长度为零,它将不包含周末时间。如果它的长度为 48 小时或更短,它的周末时间将等于它的长度。否则,它的周末时间将是 48 小时。
  2. 中间区块的周末时间是它的持续时间乘以 2/7(微不足道,因为我们对其开始和结束的限制,它是一个整数周。)
  3. 如果其持续时间小于或等于五天,则最后一个块将不包含周末时间。如果其持续时间大于五天,则其周末时间将等于其持续时间减去五天。

特别案例

如果该块不包含星期一午夜,则认为第二个和第三个块的长度为零。找到块内的一个周末的开始和结束(如果存在)并计算重叠。

如果该块恰好包含一个星期一午夜,则将第一个块视为其之前的时间,第二个块的长度为零,第三个块为其之后的时间,并照常计算。

于 2012-10-08T14:27:20.043 回答
0

我敢肯定有一些更快和更少处理器消耗的方法来解决这个问题。但对我来说,这种方法已经足够好了,可以完成工作。

//$sDateRaw = First day at 00:00 in Unix Epoch
//$eDateRaw = Last day(+1) at 00:00 in Unix Epoch
//86400 = Number of seconds in 1 day

for($i=$sDateRaw;$i<$eDateRaw; $i+=86400){
    if(date("N",$i) != 6 && date("N",$i) != 7){
        $weekDays += 1;
    }
}
//$weekDays = Total number of days excluding weekends
于 2012-10-09T09:13:38.347 回答