Как я могу использовать PHP для перечисления всех дат в году?

Я пытаюсь использовать PHP для создания скрипта, который ищет все дни между настоящим моментом и годом и перечисляет все даты по пятницам и субботам. Я пытался использовать функции PHP date() и mktime(), но не могу придумать, как это сделать. Является ли это возможным?

Спасибо, Бен


person Ben    schedule 28.10.2010    source источник


Ответы (4)


Вот как это сделать классным способом, особенно благодаря относительным форматам strtotime. .

$friday = strtotime('Next Friday', time());
$saturday = strtotime('Next Saturday', time());
$friday = strtotime('+1 Week', $friday);
$saturday = strtotime('+1 Week', $saturday);

Конечно, вы должны настроить его так, чтобы он делал именно то, что вы хотите, но это не то, о чем я пытался сказать.

Также обратите внимание, что strtotime даст вам метки времени. Чтобы узнать дату, используйте:

date('Y-m-d', $friday)

Еще одна вещь, которую нужно знать, это то, что Next <dayofweek> исключит ваш текущий день из поиска, поэтому, если вы также хотите включить текущий день, вы можете сделать это следующим образом:

$friday = strtotime('Next Friday', strtotime('-1 Day', time()));

А вот и полноценный рабочий скрипт, который делает именно то, что вы хотели.

<?php
// prevent multiple calls by retrieving time once //
$now = time();
$aYearLater = strtotime('+1 Year', $now);

// fill this with dates //
$allDates = Array();

// init with next friday and saturday //
$friday = strtotime('Next Friday', strtotime('-1 Day', $now));
$saturday = strtotime('Next Saturday', strtotime('-1 Day', $now));

// keep adding days untill a year has passed //
while(1){
    if($friday > $aYearLater)
        break 1;
    $allDates[] = date('Y-m-d', $friday);
    if($saturday > $aYearLater)
        break 1;
    $allDates[] = date('Y-m-d', $saturday);

    $friday = strtotime('+1 Week', $friday);
    $saturday = strtotime('+1 Week', $saturday);
}

//XXX: debug
var_dump($allDates);

?>

Удачи, Алин

person Alin Purcaru    schedule 28.10.2010
comment
Спасибо, Алин, это как раз то, что я искал! Абсолютно блестящий! - person Ben; 01.11.2010

С объектами DateTime:

<?php

define('FRIDAY', 5);
define('SATURDAY', 6);

$from = new DateTime;
$to = new DateTime('+1 year');

for($date=clone $from; $date<$to; $date->modify('+1 day')){
    switch($date->format('w')){
        case FRIDAY:
        case SATURDAY:
            echo $date->format('r') . PHP_EOL;
    }
}

Обновление: я добавил часть $date=clone $from, чтобы отметить, что объекты в PHP/5 больше не копируются с помощью оператора =, а ссылаются на них.

person Álvaro González    schedule 28.10.2010

    $number_of_days_from_now = 365;
    $now = time();

    $arr_days = array();

    $i = 0;
    while($i <> $number_of_days_from_now){
        $str_stamp = "- $i day";
        $arr_days[] = date('Y-m-d',strtotime($str_stamp,$now));
        $i ++;
    }

    var_dump($arr_days);

Я сделал что-то похожее на принятый ответ, который мне не подходил

person Julio Marins    schedule 14.06.2014

person    schedule
comment
Расчеты, использующие 86400, предполагают, что все дни состоят из 24 часов, что не всегда так. В следующую субботу в Испании будет 25 часов из-за перехода на летнее время. - person Álvaro González; 28.10.2010
comment
Также обратите внимание, что правила перехода на летнее время сильно различаются по всему миру. Вот почему вы должны использовать встроенные функции языка при манипулировании временем. - person Alin Purcaru; 28.10.2010
comment
Переход на летнее время выравнивается в течение года. Где бы вы ни находились, он всегда вступает в силу посреди ночи, поэтому лучше не использовать полночь в качестве базовой линии, но в остальном для этой цели вы должны быть в безопасности, добавляя 86400. - person Spudley; 29.10.2010