Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP日期-Unix时间戳_Php_Date_Unix Timestamp - Fatal编程技术网

PHP日期-Unix时间戳

PHP日期-Unix时间戳,php,date,unix-timestamp,Php,Date,Unix Timestamp,有人能帮我解开这个PHP时间戳之谜吗 我试图根据两个给定的日期查找工作日数 我得到了一个字符串日期,例如开始日期:2019年10月1日(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作为上述日期转换的结果 然

有人能帮我解开这个PHP时间戳之谜吗

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

我得到了一个字符串日期,例如开始日期:2019年10月1日(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作为上述日期转换的结果

然后我使用一个循环来运行它,这样我就可以根据给定的两个日期找到周天数

这是一个循环的结果,正如你所看到的,由于某种原因,10月27日再次发生

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

date_default_timezone_set('Europe/London');
这是下面结果背后的代码

基于最后日期的总计$total_天(在这种情况下为2019年10月31日,即:31天)

2019年10月应该有23个工作日,因为我有2个27个10月,所以我只有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++;
    }
  }
$wk_days=数组(1,2,3,4,5);
$days=0;
对于($i=0;$i<$total_天;$i++){
$tmp=$first+($i*86400);
echo$i.“x86400添加到“$first.”==>“$tmp.”,新日期为“.date('Y-m-d',$tmp)。”
; $chk=日期('w',$tmp); if(在数组中($chk,$wk_天)){ $days++; } }
0 x86400添加到156984400==>156984400,新日期为 2019-10-01

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

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

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

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

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

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

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

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

27 x86400添加到156984400==>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

试着这样做(见我上面的评论),以避免从夏季改为冬季的问题:

$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++;
    }
  }
$first=date('U',mktime(12/*12 pm!!*/,0,0,$s[1],$s[0],$s[2]);
//
//这里有一些作者没有展示的代码,我们很难推断
// ...
//
$wk_days=数组(1,2,3,4,5);
$days=0;
对于($i=0;$i<$total_天;$i++){
$tmp=$first+($i*86400);
echo$i.“x86400添加到“$first.”==>“$tmp.”,新日期为“.date('Y-m-d',$tmp)。”
; $chk=日期('w',$tmp); if(在数组中($chk,$wk_天)){ $days++; } }
也许您可以尝试使用此代码:

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

我为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

你不需要那么复杂的东西。您可以进行一个简单的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;
}
函数getNoOfWeekdays(字符串$startdate,字符串$enddate,字符串$format='d/m/Y'):int { $start=date\u根据格式创建($format$startdate); $end=date\从\格式创建\格式($format,$enddate); $count=0; 而($start format('N')<6)$count++; $start->modify(“+1天”); } 返回$count; }
1569884400是9月30日,而不是10月1日。这可能是问题所在吗?(请注意,我还没有详细讨论其余的逻辑。)我认为首先,你应该在开始时仔细检查你的转换。你在午夜计算日期。你应该在晚上12点计算,以避免在10月最后一个星期日从夏季变为冬季时出现问题。所以使用
date('U',mktime(12,0,0,$s[1],$s[0],$s[2])这是否意味着,尽管我们引入了时区,但我们必须手动处理夏季时间?不,不,我的意思是,如果您从一天边界的时间戳(午夜)计算日期,并且边界一年移动两次,秋季的一天为25小时,春季的一天为23小时,你会产生不必要的副作用。这就是为什么我建议你在下午12点计算一天的时间戳,而不是在午夜。过了一段时间,我意识到在伦敦时区可能起作用的东西在反足类可能不起作用。以一种不与时区和夏令时交互的方式执行日期算术应该更为谨慎。我按照您的建议更新了代码,它运行良好。感谢您的提示帮助。除了简单的while循环之外,还可以使用DatePeriod和DateInterval“+1 weekday”来完成此操作。必须为此修改开始日期。