PHP找到最接近的特定日期

时间:2011-12-14 15:42:26

标签: php

我正在编写一个脚本,可以获取有关我的网站今年某个日期的统计信息,但我也想让它获取去年最近的相应日期的数据,以便我可以对它们进行比较。

例如,如果我要获取“2011年12月14日星期三”的数据,我还想获得“2010年12月15日星期三”的数据。

我在考虑如何从今年的日期获得正确的日期时遇到了一些麻烦。我希望能够将数据传递给函数,例如:

// $date as a unix timestamp
// $day (0 for Sunday through 6 for Saturday)
function getClosestDay($date,$day=0) {

}

所以我会传递去年日期的unix时间戳,也是我想找的那一天。我希望它能返回正确日期的unix时间戳。

但我不确定从哪里开始使用该功能。

我不是在寻找有人为我写这个功能,但是如果有人对从哪里开始有任何想法(即使是朝着正确的方向推进),那就太棒了!

6 个答案:

答案 0 :(得分:4)

我相信这样做。首先我们得到去年同一天的unix时间

$newDate = '14th Dec 2011';
$newDate = strtotime($newDate);
$oldDate = strtotime('-1 year',$newDate);

现在我们发现工作日的差异。在这个例子中,它将是-1

$newDayOfWeek = date('w',$oldDate);
$oldDayOfWeek = date('w',$newDate);
$dayDiff = $oldDayOfWeek-$newDayOfWeek;

然后我们将这个差异提取/添加到日期

$oldDate = strtotime("$dayDiff days",$oldDate);

并输出

print date('r',$oldDate)."\n";
print date('r',$newDate)."\n";

以上应该产生

Wed, 15 Dec 2010 00:00:00 +0100
Wed, 14 Dec 2011 00:00:00 +0100

答案 1 :(得分:2)

以下是我提出的建议:

function getClosestDate($date, $day = 0, $year = -1) {
    $cts = strtotime($date);
    $ts = strtotime("{$year} YEAR", $cts);

    $days = array(
        'Sunday',
        'Monday',
        'Tuesday',
        'Wednesday',
        'Thursday',
        'Friday',
        'Saturday',
    );
    $day = $days[$day];

    $prev = strtotime("PREVIOUS {$day}", $ts);
    $next = strtotime("NEXT {$day}", $ts);

    $prev_gap = $ts - $prev;
    $next_gap = $next - $ts;

    return $prev_gap < $next_gap ? $prev : $next;
}

echo date('Y-m-d', getClosestDate('2011-12-12', 1));
// prints 2010-12-13 (closest Monday to 2010-12-12)

echo date('Y-m-d', getClosestDate('2011-12-12', 4));
// prints 2010-12-09 (closest Thursday to 2010-12-12)

顺便说一句(幸运的是),2011年12月14日不是星期一。 :)

答案 2 :(得分:1)

我明白了,在这里:

function getClosestDay($date) {
    $w = date("w", strtotime("-1 year", $date));
    $week = date("w", $date);
    $days = ($week - $w);

    return date("Y-m-d l", strtotime($days . " days -1 year", $date));
}

echo getClosestDay(mktime(0,0,0,12,14,2011));

答案 3 :(得分:0)

试试这个

function getClosestDay($date,$day=0) {
  $days = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
  return strtotime('last ' . $days[$day], $date);
}

答案 4 :(得分:0)

这是一个不太优雅但经过测试的功能:

function getClosestDay($time,$dayOfTheWeek) {
    $last_year=strtotime("last year",$time);
    $next=strtotime("next $dayOfTheWeek",$last_year);
    $last=strtotime("previous $dayOfTheWeek",$last_year);

    $most_near = (min($next-$last_year,$last_year-$last) == ($next-$last_year)) ? $next : $last;

    return $most_near;
}

答案 5 :(得分:-1)

你试过strtotime吗?

strtotime('-1 year',time());