星期一星期一等

时间:2011-06-15 18:11:35

标签: php datetime

如何在这两个日期之间回复星期一/星期三/星期五的所有日期?

这就是我一直在使用的:

    function get_days ( $s, $e )
{
    $r = array ();
    $s = strtotime ( $s . ' GMT' );
    $e = strtotime ( $e . ' GMT' );

    $day = gmdate ( 'l', $s );

    do
    {
        $r[] = $day . ', ' . gmdate ( 'Y-m-d', $s );

        $s += 86400 * 7;

    } while ( $s <= $e );

    return $r;
}

print_r ( get_days ( $start, $end ) );

3 个答案:

答案 0 :(得分:1)

试试这个:

function getDates($start_date, $end_date, $days){

    // parse the $start_date and $end_date string values
    $stime=new DateTime($start_date);
    $etime=new DateTime($end_date);

    // make a copy so we can increment by day    
    $ctime = clone $stime;
    $results = array();
    while( $ctime <= $etime ){

        $dow=$ctime->format("w");
        // assumes $days is array containing integers for Sun (0) - Sat (6)
        if( in_array($dow, $days) ){ 
            // make a copy to return in results
            $results[]=clone $ctime;
        }
        // incrememnt by 1 day
        //$ctime=date_add($ctime, date_interval_create_from_date_string('1 days'));
        $ctime->modify("+1 days");
    }

    return $results;
}

// get every Tues, Wed, Fri from now to End of June
getDates('2011-06-15','2011-06-30',array(2,3,5));

答案 1 :(得分:0)

您应该可以使用strtotime()获取日期。它接受next Tuesday之类的参数,并将2011-06-15解析为正确的时间戳。是的,你需要一个(或多个)循环。

这足以指出你正确的方向。

好的,你在我写答案时更新了你的问题。你不能假设一天总有86400秒。当DST开始或结束时,您的假设将是不正确的。

答案 2 :(得分:0)

<?php

$start = "1 Jan 2011";
$end = "20 Jan 2011";

$dates = getDays($start, $end);

print_r($dates);

function getDays($start,$end)
{
    $t = new DateTime("$start 12:00");
    $e = new DateTime($end ." 12:00");

    $out = array();
    for (; $t<=$e; $t->modify("+1 day")) {
        $day = $t->format("D");
        if (in_array($day, array('Mon','Wed','Fri'))) {
            $out[] = $t->format('d M Y');
        }
    }

    return $out;
}