用php获取未来的具体日期

时间:2015-01-07 19:58:26

标签: php date

所以我的问题很简单,但解决方案一直在躲避我。我试图以一个设定的时间间隔获得未来日期的列表,这个时间间隔是在一周中的一个月和一周中的一周。例如,我需要在3个月之间列出第二个星期一的日期。

我有一个表格,用户指定2个日期和间隔。

所以我拥有的是:

$start_date = "2015-01-07";
$end_date = "2016-01-07";
$period = "+1 month";

然后,使用此链接stackoverflow中的此函数,我得到了我的start_date是什么周长:(即:"第一个星期一")

function literalDate($timestamp) {
    $timestamp = is_numeric($timestamp) ? $timestamp : strtotime($timestamp);
    $weekday = date('l', $timestamp);
    $month = date('M', $timestamp);

$ord = 1;

while(date('M', ($timestamp = strtotime('-1 week', $timestamp))) == $month) {
    $ord++;
}

$lit = array(null, 'first', 'second', 'third', 'fourth', 'fifth');

return $lit[$ord].' '.$weekday;
}
$day_number = literalDate($start_date);
$list=array();

然后。我试图这样做

while(strtotime($start_date) <= strtotime($end_date))
{
  $list[]=$start_date;
  $start_date=date('Y-m-d', strtotime("$start_date $period"));
  $month = date('F', strtotime($start_date));
  $start_date = date('Y-m-d', strtotime($day_number.' of '.$month)); //this always returns 1970-01-01
}

print_r($list);

如评论中所述,我的预期输出类似于

array(
[0] => 2015-01-07
[1] => 2015-02-04
[2] => 2015-03-04
[3] => 2015-04-01
[4] => 2015-05-06
[5] => 2015-06-03
[6] => 2015-07-01
[7] => 2015-08-05
[8] => 2015-09-02
[9] => 2015-10-07
[10] => 2015-11-04
[11] => 2015-12-02
)

2 个答案:

答案 0 :(得分:3)

根据我的理解,DateInterval可以满足您的需求:

$start    = new DateTime('2015-01-07');
$start->modify('first day of this month');
$end      = new DateTime('2016-01-07');
$end->modify('first day of this month');
$interval = DateInterval::createFromDateString('first wednesday');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt) {
    $d = $dt->format("d");
    if($d <= 7){
       echo $dt->format("Y-m-d") . "\n";
    }
}

将显示:

2015-01-07
2015-02-04
2015-03-04
2015-04-01
2015-05-06
2015-06-03
2015-07-01
2015-08-05
2015-09-02
2015-10-07
2015-11-04
2015-12-02
2016-01-06

答案 1 :(得分:-1)

strtotime(),参考今天。

strtotime("+x days");

strtotime

如果你需要与另一个约会相关的东西......

  

日期(&#34; Y-m-d&#34;,strtotime($ yourdate)+ 86400 * $天);