年或年/月的第一天和最后一天


First and Last Datetime for year or year/month

我有一个操作,它接受年份和可选的月份。我需要查询在该时间内写的所有文章,所以我需要该时间范围的绝对第一个和最后一个有效日期时间。

    $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'));

是否有更简洁的方式来写这个?

$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查询的值,你可能不需要在这里涉及太多。