为了账号安全,请及时绑定邮箱和手机立即绑定

PHP 日期 - Unix 时间戳

PHP 日期 - Unix 时间戳

PHP
临摹微笑 2022-08-05 09:45:38
有人可以帮我解决这个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-011 x86400 添加到 1569884400 ==> 1569970800 新日期为 2019-10-022 x86400 添加到 1569884400 ==> 1570057200 新日期为 2019-10-033 x86400 添加到 1569884400 ==> 1570143600 新日期为 2019-10-044 x86400 添加到 1569884400 ==> 1570230000 新日期为 2019-10-05...23 x86400 添加到 1569884400 ==> 1571871600 新日期为 2019-10-2424 x86400 添加到 1569884400 ==> 1571958000 新日期为 2019-10-2525 x86400 添加到 1569884400 ==> 1572044400 新日期为 2019-10-2626 x86400 添加到 1569884400 ==> 1572130800 新日期为 2019-10-27 //***27 x86400 添加到 1569884400 ==> 1572217200 新日期为 2019-10-27 //***28 x86400 添加到 1569884400 ==> 1572303600 新日期为 2019-10-2829 x86400 添加到 1569884400 ==> 1572390000 新日期为 2019-10-2930 x86400 添加到 1569884400 ==> 1572476400 新日期为 2019-10-30
查看完整描述

4 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

你不需要任何复杂的东西。您可以有一个简单的 while 循环并计算工作日。这可能不是最有效的方法,但它应该有效。


function getNoOfWeekdays(string $startdate, string $enddate, string $format = 'd/m/Y'): int

{

    $start = date_create_from_format($format, $startdate);

    $end = date_create_from_format($format, $enddate);


    $count = 0;

    while ($start <= $end) {

        if ($start->format('N') < 6) $count++;

        $start->modify('+1 days');

    }


    return $count;

}


查看完整回答
反对 回复 2022-08-05
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

我为DateTime API创建了一个名为dt的PHP扩展。你可以在这里找到它。使用它非常简单:


$start = '2019-10-01';

$end = '2019-11-01'; 


$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


查看完整回答
反对 回复 2022-08-05
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

试试这个(见我上面的评论),以避免从夏天到冬天的问题:


$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);

  $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++;

    }

  }


查看完整回答
反对 回复 2022-08-05
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

也许你可以试试这个代码:


  $initial = "2019-10-01";

  $last = "2019-10-31";

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

  $days = 0;

  $date = $initial;

  do{


    $chk = date("w",strtotime($date));

    if(in_array($chk,$wk_days))

      $days++;

    $date = date("Y-m-d",strtotime("$date +1 day"));


  }while($date!=date("Y-m-d",strtotime("$last +1 day")));

    echo $days;

?>


查看完整回答
反对 回复 2022-08-05
  • 4 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信