получение конкретных дат в будущем с помощью php

0

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

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

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

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

то, используя эту функцию из этой ссылки qaru.site/questions/516035/... я получаю, в какой неделе мой 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
)
  • 0
    Покажите ожидаемый результат для примера, который вы предоставили.
  • 0
    Вы расставляете даты между строками и целыми числами, как пьяный, шатающийся по дороге. После того, как вы strtotimed строку, оставьте ее как целое число, потому что неизменно вы просто будете снова преобразовывать ее обратно в int в следующей строке кода.
Показать ещё 1 комментарий
Теги:
date

2 ответа

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 месяцев» к объекту и переместить определенную дату, например «второе воскресенье», и просто распечатать ее.
  • 0
    да, и обратите внимание, что если заявление, у меня было меньше 7, чтобы показать только первый понедельник, так что вам придется изменить это
Показать ещё 3 комментария
-1

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

strtotime("+x days");

StrToTime

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

date ("Ymd", strtotime ($ yourdate) + 86400 * $ дней);

  • 0
    это не работает, потому что я не хочу добавлять х количество времени к дате. я хочу, чтобы дата была первой, второй, третьей, последней и т. д. понедельника определенного интервала (1 месяц, 3 месяца и т. д.), мне удалось сделать что-то похожее, но если у меня есть период 1 месяц, и добавлен 1 месяц , вычитал 4 дня и переходил к следующему понедельнику, в итоге это была разница в 2, 3 недели между start_date и end_date за 1 год. мне нужно что-то более точное, чем это
  • 0
    Я даю вам инструменты для этого, а не делаю это для вас. Мне жаль, что вы чувствуете, что сообщество должно сделать все это для вас.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню