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

Php 年或年/月的第一个和最后一个日期时间,php,datetime,Php,Datetime,我有一个接受一年和一个可选月份的操作。我需要查询在该时间内写的所有文章,因此我需要该时间跨度的绝对第一个和最后一个有效日期时间 $start = new \DateTime(); $start->setDate((int) $year, (int) ($month ?: 1), 1); $start->setTime(0, 0); $end = clone $start; $end->add(new \DateInterval($mon

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

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

不确定是否考虑这种清洁剂,但它较短,没有相关计算。

写这篇文章最干净、最容易理解的方式可能是:

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

不确定是否考虑这种清洁剂,但它较短,没有相关计算。

写这篇文章最干净、最容易理解的方式可能是:

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

为什么不查询该时间跨度内的所有文章,按文章撰写日期升序或降序(最新或最旧)排序,并将1限制为仅获取最早或最新的一篇。您可能不需要从所需的行中分别查找日期时间。现在,您可以在文件的开头添加一个
use DateTime
,而不是在
\DateTime
中始终使用反斜杠(我想这是因为您使用的是名称空间)。然后可以省略反斜杠。为什么不查询该时间跨度内的所有文章,按文章撰写日期升序或降序(最新或最旧),并将1限制为仅获取最早或最新的一篇。您可能不需要从所需的行中分别查找日期时间。现在,您可以在文件的开头添加一个
use DateTime
,而不是在
\DateTime
中始终使用反斜杠(我想这是因为您使用的是名称空间)。然后可以省略反斜杠。