我有一个接受一年和一个可选月份的行动。我需要查询在那段时间内写的所有文章,所以我需要该时间跨度的绝对第一个和最后一个有效日期时间。
$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'));
有没有更简洁的方法来写这个?
答案 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
。