年份或年份/月份的第一个和最后一个日期时间

时间:2011-07-23 01:28:52

标签: php datetime

我有一个接受一年和一个可选月份的行动。我需要查询在那段时间内写的所有文章,所以我需要该时间跨度的绝对第一个和最后一个有效日期时间。

    $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 个答案:

答案 0 :(得分:3)

$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");
}

如果您打算将此作为SQL查询的值使用,则可能不需要在此处涉及DateTime