我的一天结束是这样的:
function endofday($date_to_change)
{
$date_to_change = date('Y-m-d');
$date_to_change = date('Y-m-d H:i:s', strtotime("+23 hours 59 minutes 59 seconds", strtotime($date_to_change)));
return date("Y-m-d H:i:s", $date_to_change);
}
它确实有效,但是这是从约会中获取 23:59:59 的正确且最有效的方法吗?我的目标是从带有或不带时间传入的日期中的 00:00:00 到 23:59:59 之间从 mysql 数据库中选择行。
如果你不想使用这种SQL查询
where end_date < '2020-09-01' # this date is 1 day after the actual end date
您可以使用 DateTime() 函数
$endDate = date_create('2020-08-31')->modify('+1 day -1 microsecond')
Можно и так
$begin = date('年月日 00:00:00');
$end = date('年月日 23:59:59',strtotime($date_to_change));
为什么不使用
date >= start && date < end
?
一般来说,使用包含开始和排除结束是一种标准的编程方式。否则您将排除 23:59:59.500。
如果使用
end-start
,您也能始终获得正确的(时间)差异。
最后您可以使用
end
作为下一个范围的开始,而无需调整它。
在我看来,使用专有的最终值/时间只有优点。
如果您想打印时间,可以使用
time-1
打印 23:59:59
,或 time-0.001
打印 23:59:59.999
。无论如何,人们像以前一样理解until 20:00
的含义。20:00
$today = new \DateTime('midnight today');
$endOfDay = (new \DateTime('midnight tomorrow'));
var_dump($today < $endOfDay);
var_dump($today->format('Y-m-d H:i:s')); // 2022-02-08 00:00:00
var_dump($endOfDay->format('Y-m-d H:i:s')); // 2022-02-09 00:00:00
会给你(注意
function endOfDay(string $dateToChange): \DateTime
{
return (new \DateTime($dateToChange))->setTime(23, 59, 59);
}
var_dump(endOfDay('2019-05-04'));
包含TZ信息
)
\DateTime
但是,正如@Wiimm在他的回答中提到的那样,这样你就会错过一天中的一秒钟。所以使用起来会更正确
object(DateTime)#1 (3) {
["date"]=> string(26) "2019-05-04 23:59:59.000000"
["timezone_type"]=> int(3)
["timezone"]=> string(3) "UTC"
}
以及正确的比较:
function startOfDay(\DateTime $dt): \DateTime
{
return (clone $dt)->setTime(0, 0, 0);
}
$date = new \DateTime('2019-05-04 15:25:13'); // 2019-05-04 15:25:13.000000
$dateNextDay = (clone $date)->modify('+1 day'); // 2019-05-05 15:25:13.000000
$isInBetween = startOfDay($date) <= $date && $date < startOfDay($dateNextDay); // true
(
否则原来的
clone
将被修改)并完全切换到
$date
。
大多数 ORM 已经知道如何使用 DateTime
,但如果您需要将其转换为字符串:
\DateTime
给定一个日期时间对象:
echo $date->format('Y-m-d H:i:s'); // 2019-05-04 00:00:00
$date = DateTime::createFromFormat('Y-m-d', '2024-03-01');
$startOfTheDay = $date->setTime(0,0);