这是在 PHP 中获取一天结束时间的正确方法吗?

问题描述 投票:0回答:6

我的一天结束是这样的:

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 数据库中选择行。

php date time format
6个回答
2
投票

如果你不想使用这种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')

1
投票

Можно и так
$begin = date('年月日 00:00:00');
$end = date('年月日 23:59:59',strtotime($date_to_change));


1
投票

为什么不使用

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
的含义。
    


1
投票

20:00



0
投票

$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



0
投票

给定一个日期时间对象:

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);
© www.soinside.com 2019 - 2024. All rights reserved.