PHP 日期 - Unix 时间戳

有人可以帮我解决这个PHP时间戳谜语吗?


我试图根据两个给定的日期找到工作日的数量。


我得到一个字符串日期,例如开始日期:01 / 10 / 2019(2019年10月1日)并将其分解为数组= > $s


数组$s设置如下:


Array ( [0] => 01 [1] => 10 [2] => 2019 )

然后我从中制作了一个Unix时间戳:


date('U', mktime(0, 0, 0, $s[1], $s[0], $s[2]));

由于上述日期转换,我得到了1569884400。


然后我使用循环来运行它,所以我可以根据2个给定的日期找到周天数。


这是该循环的结果,正如您所看到的,由于某种原因,10月27日重复。


只是为了澄清这个PHP页面的顶部,我已经设置了时区


date_default_timezone_set('Europe/London');

这是以下结果背后的代码


基于最后日期的总$total天数(在本例中为 2019 年 10 月 31 日,即:31 天)


2019年10月应该有23个工作日,因为我得到2x 27th十月,我将只得到22个工作日。


我在这里做错了什么?


 $wk_days = array(1, 2, 3, 4, 5);

  $days = 0;

  for ($i = 0; $i < $total_days; $i++) {

    $tmp = $first + ($i * 86400);

    echo  $i." x86400 add to ". $first . " ==> " . $tmp. " and the new date is "  .date('Y-m-d',$tmp) ."<br/>";


    $chk = date('w', $tmp);


    if (in_array($chk, $wk_days)) {

      $days++;

    }

  }

0 x86400 添加到 1569884400 ==> 1569884400 新日期为 2019-10-01


1 x86400 添加到 1569884400 ==> 1569970800 新日期为 2019-10-02


2 x86400 添加到 1569884400 ==> 1570057200 新日期为 2019-10-03


3 x86400 添加到 1569884400 ==> 1570143600 新日期为 2019-10-04


4 x86400 添加到 1569884400 ==> 1570230000 新日期为 2019-10-05


...


23 x86400 添加到 1569884400 ==> 1571871600 新日期为 2019-10-24


24 x86400 添加到 1569884400 ==> 1571958000 新日期为 2019-10-25


25 x86400 添加到 1569884400 ==> 1572044400 新日期为 2019-10-26


26 x86400 添加到 1569884400 ==> 1572130800 新日期为 2019-10-27 //***


27 x86400 添加到 1569884400 ==> 1572217200 新日期为 2019-10-27 //***


28 x86400 添加到 1569884400 ==> 1572303600 新日期为 2019-10-28


29 x86400 添加到 1569884400 ==> 1572390000 新日期为 2019-10-29


30 x86400 添加到 1569884400 ==> 1572476400 新日期为 2019-10-30


临摹微笑
浏览 95回答 4
4回答

Cats萌萌

你不需要任何复杂的东西。您可以有一个简单的 while 循环并计算工作日。这可能不是最有效的方法,但它应该有效。function getNoOfWeekdays(string $startdate, string $enddate, string $format = 'd/m/Y'): int{&nbsp; &nbsp; $start = date_create_from_format($format, $startdate);&nbsp; &nbsp; $end = date_create_from_format($format, $enddate);&nbsp; &nbsp; $count = 0;&nbsp; &nbsp; while ($start <= $end) {&nbsp; &nbsp; &nbsp; &nbsp; if ($start->format('N') < 6) $count++;&nbsp; &nbsp; &nbsp; &nbsp; $start->modify('+1 days');&nbsp; &nbsp; }&nbsp; &nbsp; return $count;}

拉丁的传说

我为DateTime API创建了一个名为dt的PHP扩展。你可以在这里找到它。使用它非常简单:$start = '2019-10-01';$end = '2019-11-01';&nbsp;$start = dt::create($start);//exclude end with true as 3.parameter$countWeekdaysOct2019 = $start->countDaysTo('1,2,3,4,5',$end, true); //23$countSundaysOct2019 = $start->countDaysTo('0',$end, true); //4$countSaturdaysOct2019 = $start->countDaysTo('6',$end, true); //4

婷婷同学_

试试这个(见我上面的评论),以避免从夏天到冬天的问题:$first = date('U', mktime(12 /* 12 pm!! */, 0, 0, $s[1], $s[0], $s[2]));//// some code here that the author didn't show and we hardly can extrapolate// ...//$wk_days = array(1, 2, 3, 4, 5);&nbsp; $days = 0;&nbsp; for ($i = 0; $i < $total_days; $i++) {&nbsp; &nbsp; $tmp = $first + ($i * 86400);&nbsp; &nbsp; echo&nbsp; $i." x86400 add to ". $first . " ==> " . $tmp. " and the new date is "&nbsp; .date('Y-m-d',$tmp) ."<br/>";&nbsp; &nbsp; $chk = date('w', $tmp);&nbsp; &nbsp; if (in_array($chk, $wk_days)) {&nbsp; &nbsp; &nbsp; $days++;&nbsp; &nbsp; }&nbsp; }

人到中年有点甜

也许你可以试试这个代码:&nbsp; $initial = "2019-10-01";&nbsp; $last = "2019-10-31";&nbsp; $wk_days = array(1, 2, 3, 4, 5);&nbsp; $days = 0;&nbsp; $date = $initial;&nbsp; do{&nbsp; &nbsp; $chk = date("w",strtotime($date));&nbsp; &nbsp; if(in_array($chk,$wk_days))&nbsp; &nbsp; &nbsp; $days++;&nbsp; &nbsp; $date = date("Y-m-d",strtotime("$date +1 day"));&nbsp; }while($date!=date("Y-m-d",strtotime("$last +1 day")));&nbsp; &nbsp; echo $days;?>
打开App,查看更多内容
随时随地看视频慕课网APP