PHP查找最接近日期的特定日期

PHP查找最接近日期的特定日期,php,Php,我正在写一个脚本,它可以获取今年某个日期我的网站的一些统计数据,但我也希望它能够为我提供去年最接近的相应日期的数据,以便我可以比较它们 例如,如果我要获得“2011年12月14日星期三”的数据,我还想获得“2010年12月15日星期三”的数据 我在思考如何从今年的日期中获得正确的日期时遇到了一些麻烦。我希望能够将数据传递到函数中,例如: // $date as a unix timestamp // $day (0 for Sunday through 6 for Saturday) funct

我正在写一个脚本,它可以获取今年某个日期我的网站的一些统计数据,但我也希望它能够为我提供去年最接近的相应日期的数据,以便我可以比较它们

例如,如果我要获得“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时间戳

但我甚至不知道从哪里开始使用这个函数


我不是在找人为我写函数,但如果有人对从哪里开始有任何想法(甚至是朝正确的方向轻推),那就太好了

你试过Strottime吗


strotime('-1年',time())

我知道了,它是这样的:

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))

我相信这样就可以了。首先,我们得到了去年同一天的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
试试这个

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

以下是我的想法:

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)
函数getClosestDate($date,$day=0,$year=-1){ $cts=标准时间($date); $ts=strotime(“{$year}year”,$cts); $days=数组( "星期日",, “星期一”, "星期二",, “星期三”, "星期四",, “星期五”, “星期六”, ); $day=$days[$day]; $prev=strotime(“上一个{$day}”,$ts); $next=strotime(“next{$day}”,$ts); $prev_差距=$ts-$prev; $next_gap=$next-$ts; 返回$prev_gap<$next_gap?$prev:$next; } 回音日期('Y-m-d',getClosestDate('2011-12-12',1)); //打印2010-12-13(最接近2010-12-12的星期一) 回音日期('Y-m-d',getClosestDate('2011-12-12',4)); //打印2010-12-09(最接近2010-12-12的星期四)

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

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

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;
}

那会发现我和去年是同一天。我想要最接近去年同一天的日期。正如我上面的例子所述:如果我要获取“2011年12月14日星期一”的数据,我还想获取“2010年12月13日星期一”的数据。1年1天不起作用,并不总是-1年1天,这完全取决于传入的日期。同样,如果我这样做,传入“2011年12月14日星期一”将返回我“2010年12月14日星期二”,这不是我想要的。我想要最接近那个日期的星期一(或者我选择在函数中放置的任何其他日期)。现在它可以工作了,尽管我更喜欢netcoder和Kristian Antonsen的方法-所以如果需要,我可以选择日期。不过谢谢:)太棒了-解决差异似乎是最好的方法!谢谢沙哈,很明显我在日历上看错了日期<代码>2011年12月14日星期一,您能解释一下吗?根据我Mac电脑的时钟,是星期三。是的,我的约会搞错了,抱歉!