2015-01-07 1 views
0

, поэтому моя проблема довольно проста, но решение продолжает уклоняться от меня. Я пытаюсь получить список будущих дат с заданным интервалом, который соответствует неделе nr в месяц и день nr в неделю. например, мне нужно составить список дат 2-го понедельника на расстоянии 3 месяца.получение конкретных дат в будущем с помощью php

У меня есть форма, где пользователь указывает 2 даты и интервал.

так, что у меня есть что-то вроде:

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

затем, используя эту функцию из этой ссылки stackoverflow я получить то, что weeknr мой датой_начала является: (то есть: "первый понедельник")

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

Показать, что ваш ожидаемый результат для примера вы предусмотрели. –

+0

Вы ошеломляете свои даты вокруг строк и целых чисел, как пьяный, ошеломляющий по дороге. После того, как вы strtotimed строки, ** LEAVE ** это как целое число, потому что вы всегда собираетесь преобразовать его обратно в int снова в самой следующей строке кода. –

+0

почему-то мой мозг не был предназначен для понимания функции strtotime (да, я читал phpman около 1000 раз). поэтому я не знаю, как добавить период в $ start_date, но это не строка. вот в чем причина злоупотребления конверсией – Tavi

ответ

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 
+0

, что было бы замечательно, я мог бы добавить «X месяцев» к объекту и переместить определенную дату как «второе воскресенье» и просто распечатать это. – Tavi

+0

Да, и обратите внимание, что если заявление, я имел его менее 7, чтобы показать только первый понедельник, так что вам нужно будет изменить это –

+0

спасибо mate, я уже нашел, как увеличить указанное количество месяцев и отлично наклонился, это было именно то, что мне нужно! я должен вам много пива, это было прослушивание меня целый день! (ps: пришлось обновить php для этого, но стоит того) – Tavi

-1

StrToTime(), который работает в качестве ссылки на сегодняшний день.

strtotime("+x days"); 

strtotime

, если вам нужно что-то по отношению к другой дате ...

даты ("Y-м-д", StrToTime ($ yourdate) + 86400 * $ дней);

+0

, что dosen't работает, потому что я не хочу добавлять x количество времени до даты. я хочу, чтобы дата была первой, второй, третьей, последней и т. д. в течение определенного интервала (1 месяц, 3 месяца и т. д.), я сделал что-то подобное, но если у меня есть период 1 месяц и добавлен 1 месяц , вычитал 4 дня и отправился в следующий понедельник, в конце концов, это было различие в 2, 3 недели между start_date и end_date через 1 год. Мне нужно что-то более точное то, что – Tavi

+0

Я даю вам инструменты, чтобы сделать это, а не делать это за вас. Мне жаль, что вы чувствуете, что сообщество должно сделать все это за вас. – geggleto

+0

no mate, я не хочу, чтобы вы делали это для меня, как вы могли бы вывести из моего кода, который я уже знал о strtotime. как объяснялось в моем комментарии, ваш ответ не помог мне ни разу, потому что мне нужен конкретный день недели месяца. ваш ответ не предусматривал этого. и просто так, чтобы вы знали, я не сделал ни малейшего отклонения от вашего ответа, если это то, что вас беспокоило. – Tavi

Смежные вопросы