Моя задача - найти все даты между датой начала и конечной датой таким образом, чтобы сгенерированные даты имели пробел определенного количества дней.
Давайте начнем дату с 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
Может кто-нибудь, пожалуйста, помогите мне.. Спасибо заранее :)
Попробуй это:
$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');
}
В 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;
}
Можно попробовать использовать 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>';
Эта простая функция должна сделать трюк.
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
)