PHP日期-Unix时间戳
有人能帮我解开这个PHP时间戳之谜吗 我试图根据两个给定的日期查找工作日数 我得到了一个字符串日期,例如开始日期:2019年10月1日(2019年10月1日),并将其分解为数组=>$s 数组$s设置如下: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作为上述日期转换的结果 然
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”来完成此操作。必须为此修改开始日期。