我如何制作一种如何计算两个给定天之间天数的方法?
例如,我想知道星期一和星期四之间有多少天。所以我这样计算了。
制作了一个数组,并检查周一和周四的值差。是1 - 4 = -3
。忽略负符号,我们得到了3
。因此,如果我们在当前日期添加3
,那么显然我们有星期四的日期。我无法工作的是,如果我有一个需要计算Sunday
和Wednesday
之间的天数的场景。通过应用上述技术,我们获得了7 - 3 = 4
,如果我们将4
天添加到当前日期,那么我们绝对不会获得Wednesday
。有人可以帮我吗?不确定需要应用链接列表或什么。需要帮助。
如果第一天大于第二天值,则需要抵消7。尝试这样的东西 -
function dayDiff($start,$end){
$weekDays = [
'Mon' => 1,
'Tue' => 2,
'Wed' => 3,
'Thu' => 4,
'Fri' => 5,
'Sat' => 6,
'Sun' => 7,
];
return ($weekDays[$start] < $weekDays[$end]) ? $weekDays[$end]-$weekDays[$start] : abs($weekDays[$start]-$weekDays[$end]-7);
}
这将导致 -
echo "Mon -> Thu : ".dayDiff("Mon","Thu"); //returns 3
echo "Sun -> Wed : ".dayDiff("Sun","Wed"); //returns 3
echo "Sat -> Wed : ".dayDiff("Sat","Wed"); //returns 4
示例此处 - https://3v4l.org/cryjd
如果您没有情感上依附在数组上,则使用strttime和日期有效。
它在下一个可能的开始日(星期日)创建了一个起点,并使用它来获得下一个结束的Unix(星期三)。
然后我只是从末端减去开始,而两天之间有多少秒钟,将其除以86400,我们之间有几天的数量。
$startday ="Sunday";
$endday = "Wednesday";
$start = strtotime("next $startday");
$end = strtotime(date("Y-m-d", $start) . " Next $endday");
Echo ($end-$start)/86400;
https://3v4l.org/vyjlm
function format($a, $b)
{
if (strtotime($a) > strtotime($b)) list($a, $b) = [$b, $a];
$start = strtotime($a);
$stop = strtotime($b);
$extend = ($stop - $start) / 86400;
$result['extends'] = $extend;
if ($extend < 7) {
$result['daily'] = $extend;
} elseif ($extend <= 31) {
if ($stop == strtotime($a . '+1 month')) {
$result['monthly'] = 1;
} else {
$w = floor($extend / 7);
$d = ($stop - strtotime($a . '+' . $w . ' week')) / 86400;
$result['weekly'] = $w;
$result['daily'] = $d;
}
} else {
$y = floor($extend / 365);
if ($y >= 1) {
$start = strtotime($a . '+' . $y . 'year');
$a = date('Y-m-d', $start);
if ($start > $stop) {
$a = date('Y-m-d', strtotime($a . '-1 month'));
$m = 11;
$y--;
}
$extend = ($stop - strtotime($a)) / 86400;
}
if (isset($m)) {
$w = floor($extend / 7);
$d = $extend - $w * 7;
} else {
$m = isset($m) ? $m : round($extend / 30);
$stop >= strtotime($a . '+' . $m . 'month') ? $m : $m--;
if ($stop >= strtotime($a . '+' . $m . 'month')) {
$d = $w = ($stop - strtotime($a . '+' . $m . 'month')) / 86400;
$w = floor($w / 7);
$d = $d - $w * 7;
}
}
$result['yearly'] = $y;
$result['monthly'] = $m;
$result['weekly'] = $w;
$result['daily'] = isset($d) ? $d : NULL;
}
return array_filter($result);
}