найти все даты между начальной и конечной датой с разрывом определенного количества дней в php или javascript

0

Моя задача - найти все даты между датой начала и конечной датой таким образом, чтобы сгенерированные даты имели пробел определенного количества дней.

Давайте начнем дату с 12/01/2014 (ММ/ДД/ГГГГ) и дату окончания - 01/05/2015 (ММ/ДД/ГГГГ). Мне нужно найти все даты между этими датами, чтобы разрыв между датами был 5. Это прогнозируемый результат:

12/06/2014, 12/11/2014, 12/16/2014, 12/21/2014, 12/26/2014, 12/31/2014, 01/05/2015

Может кто-нибудь, пожалуйста, помогите мне.. Спасибо заранее :)

  • 0
    где ваши попытки сделать это?
  • 0
    Вы хотите PHP или JavaScript? Для подавляющего большинства стран мира 1 мая 2015 года - 1 мая 2015 года. Это дата, которую вы ожидаете?
Показать ещё 6 комментариев
Теги:
date

4 ответа

2
Лучший ответ

Попробуй это:

$s = new DateTime('12/01/2014');
$e = new DateTime('01/05/2015');

while ($s <= $e) {
    echo $s->format('m/d/Y'), "\n";
    $s->modify('+5 day');
}

demo

  • 0
    Я думаю, что есть опечатка, запятая должна быть точка справа: echo $ s-> format ('m / d / Y'). "\ П"; Но да, я думаю, что это работает
  • 1
    @ johnjg12 нет, это не опечатка, а правильный синтаксис для эха
Показать ещё 1 комментарий
0

В javascript вы проанализируете строки в Датах, затем последовательно добавляете 5 дней к более ранней дате, пока она не пройдет более позднюю дату, собирая форматированные строки по ходу.

Вы не сказали, в каком формате строки даты, кажется, это m/d/y, что характерно для США и соседей.

// Parse date string in m/d/y format
// Separator can be any non–digit character
function parseMDY(s) {
  var b = s.split(/\D/);
  return new Date(b[2], --b[0], b[1]);
}

// Return a date string formatted as m/d/y
function formatDateMDY(d) {
  function z(n){return (n<10?'0':'') + n}
  return z(d.getMonth() + 1) + '/' + z(d.getDate()) + '/' + d.getFullYear();
} 

// Expects dates in m/d/y format
// End should be after start
// Returns an array of date strings
function getDates(start, end, gap) { 
  start = parseMDY(start);
  end = parseMDY(end);
  gap = Number(gap);
  var days = [];

  while (start < end) {
    days.push(formatDateMDY(start));
    start.setDate(start.getDate() + gap);
  }
  return days;
}
0

Можно попробовать использовать strtotime(). Пример:

function allDates($from,$to){
    $dates = array();
    $start_date = explode('/', $from);
    $end_date = explode('/', $to);
    $start_date = strtotime($start_date[2] . '-' . $start_date[0] . '-' . $start_date[1]);
    $end_date = strtotime($end_date[2] . '-' . $end_date[0] . '-' . $end_date[1]);

    if ($end_date >= $start_date){
        array_push($dates, date('d/m/Y', $start_date));
        while ($start_date < $end_date)
        {
            $start_date += 86400;
            array_push($dates,date('d/m/Y', $start_date));
        }
    }
    return $dates;
}

$allDates = allDates('12/01/2014', '01/05/2015');

print '<pre>';
print_r($allDates);
print '</pre>';
0

Эта простая функция должна сделать трюк.

function get_list($start_date, $end_date, $gap_days) {
    // convert dates to timestamp
    $start_timestamp = strtotime($start_date);
    $end_timestamp = strtotime($end_date);
    $gap_seconds = 24 * 3600 * $gap_days;
    // initialize the output
    $output = array();
    // find all the dates in between, and add them to the output array
    for ($timestamp=$start_timestamp+$gap_seconds; $timestamp<$end_timestamp; $timestamp+=$gap_seconds) {
        $output[] = date("m/d/Y", $timestamp);
    }
    // return the output
    return $output;
}

Например, это...

date_default_timezone_set("Europe/Paris");
print_r(get_list("12/01/2014", "01/05/2015", 5));

... выход...

Array
(
    [0] => 12/06/2014
    [1] => 12/11/2014
    [2] => 12/16/2014
    [3] => 12/21/2014
    [4] => 12/26/2014
    [5] => 12/31/2014
)

Ещё вопросы

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