Первая и последняя дата и время года или года / месяца - PullRequest
0 голосов
/ 23 июля 2011

У меня есть действие, которое принимает год и дополнительный месяц.Мне нужно запросить все статьи, написанные за это время, поэтому мне нужны абсолютные первая и последняя действительные дата и время для этого промежутка времени.

    $start = new \DateTime();
    $start->setDate((int) $year, (int) ($month ?: 1), 1);
    $start->setTime(0, 0);

    $end = clone $start;
    $end->add(new \DateInterval($month ? 'P1M' : 'P1Y'));
    $end->sub(new \DateInterval('PT1S'));

Есть ли более чистый способ написать это?

1 Ответ

3 голосов
/ 23 июля 2011
$start = mktime(0, 0, 0, $month ?: 1, 1, $year);
$end = mktime(23, 59, 59, $month ?: 12, $month ? date('t', $start) : 31, $year);

или

$start = new \DateTime("$year-" . ($month ?: 1) . '-1 00:00:00');
$end = new \DateTime("$year-" . ($month ?: 12) . '-' . ($month ? $start->format('t') : 31) . ' 23:59:59');

Не уверен, если вы рассмотрите этот очиститель, но он короче и обходится без относительных расчетов.

самый чистый и самый понятный способ написать это, вероятно:

if ($month) {
    $start = new \DateTime("$year-$month-1 00:00:00");
    $end   = new \DateTime("$year-$month-" . $start->format('t') . ' 23:59:59');
} else {
    $start = new \DateTime("$year-1-1 00:00:00");
    $end   = new \DateTime("$year-12-31 23:59:59");
}

Вам, возможно, вообще не потребуется задействовать DateTime, если вы собираетесь использовать это как значение для запроса SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...