我正在开发一个围绕日期的Web应用程序。
我需要根据天数来计算数字,例如 - 伪代码
$count_only = array('monday', 'wednesday', 'friday'); //count only these days
$start_date = 1298572294; // a day in the past
$finish_date = 1314210695; //another day
$var = number_of_days_between($start_date, $finish_date, $count_only);
有没有办法确定已经过了多少整天,而只计算某些天?
答案 0 :(得分:3)
您可以通过计算两个指定日期之间的完整周数,然后对开始/结束部分周进行一些数学计算来计算悬空日期,从而大大简化这一过程。
e.g。
$start_date = 1298572294; // Tuesday
$finish_date = 1314210695; // Wednesday
$diff = 1314210695-1298572294 = 15638401 -> ~181 days -> 25.8 weeks -> 25 full weeks.
然后只是检查悬空日期的一个简单问题:
Tuesday -> add 2 days for Wednesday+Friday to get to the end of the week
Wednesday -> add 1 day for Monday to get to the beginning on the week
Total countable days = (25 * 3) + 2 + 1 = 75 + 3 = 78 countable days
答案 1 :(得分:2)
当然有办法: - )
已经过去的日子只是
$elapsed_days = floor(($finish_date-$start_date) / 86400);
这不会得到您需要的结果。你可以做的是以下(pesudo)代码:
$elapsed_days = floor(($finish_date-$start_date) / 86400);
for(int $i=0;$i<$elapsed_days;$i++){
$act_day_name = strtolower(date('l',$start_date+$i*86400));
if(in_array($act_day_name,$count_only){
// found matching day
}
}
我做什么: 我在两个日期之间的每一天进行迭代,得到日期名称和日期('l');并检查它是否在数组中。 可能需要进行一些微调,但这应该可以帮到你。
答案 2 :(得分:2)
您可以创建一个循环,该循环在$count_only
数组中从$start_date
开始,并在到达$end_date
时停止(从函数返回)。
function number_of_days_between($start_date, $finish_date, $count_only) {
$count = 0;
$start = new DateTime("@$start_date");
$end = new DateTime("@$finish_date");
$days = new InfiniteIterator(new ArrayIterator($count_only));
foreach ($days as $day) {
$count++;
$start->modify("next $day");
if ($start > $end) {
return $count;
}
}
}
答案 3 :(得分:2)
比“遍历所有日子”的方法快一点:
$count_only = array(1, 3, 5); // days numbers from getdate() function
$start_date = 1298572294;
$finish_date = 1314210695;
function days($start_date, $finish_date, $count_only)
{
$cnt = 0;
// iterate over 7 days
for ($deltaDays = 0; $deltaDays < 7; $deltaDays++)
{
$rangeStart = $start_date + $deltaDays * 86400;
// check the weekday of rangeStart
$d = getDate($rangeStart);
if (in_array($d['wday'], $count_only))
{
$cnt += ceil(($finish_date - $rangeStart) / 604800);
}
}
return $cnt;
}
我们的想法是在周一,周二,周三等场合使用一些额外的补偿来计算周数。