如何在 PHP 中正确添加日期和时间(字符串)?
How to correctly add a date and a time (string) in PHP?
在 PHP 中添加日期和时间字符串的 "cleanest" 方法是什么?
虽然读到 DateTime::add
期望 DateInterval
,但我尝试了
$date = new \DateTime('17.03.2016');
$time = new \DateTime('20:20');
$result = $date->add($time);
这不好,什么也没返回给 $result
。
要从 '20:20'
制作 DateInterval
,我只找到了非常复杂的解决方案...
也许我应该使用时间戳?
$date = strtotime($datestring);
$timeObj = new \DateTime($timestring);
// quirk to only get time in seconds from string date
$time = $timeObj->format('H') * 3600 + $timeObj->format('i') * 60 + $timeObj->format('s');
$datetime = $date+$time;
$result = new \DateTime;
$result->setTimestamp($datetime);
在我的例子中,这是 returns 想要的结果,具有正确的时区偏移。但是你怎么看,这算健壮吗?有没有更好的方法?
DateTime
(和 DateTimeImmutable
)有一个 modify
方法,您可以利用该方法通过添加 20 hours
和 20 minutes
来修改时间。
已更新
我已经根据评论包含了 DateTime
和 DateTimeImmutable
的示例,您不需要将 modify
的结果分配给变量,因为它会发生变异原始对象。而 DateTimeImmutable
创建一个新实例并且不会改变原始对象。
日期时间
<?php
$start = new DateTimeImmutable('2018-10-23 00:00:00');
echo $start->modify('+20 hours +20 minutes')->format('Y-m-d H:i:s');
// 2018-10-23 20:20:00
使用DateTime
:https://3v4l.org/6eon8
DateTimeImmutable
<?php
$start = new DateTimeImmutable('2018-10-23 00:00:00');
$datetime = $start->modify('+20 hours +20 minutes');
var_dump($start->format('Y-m-d H:i:s'));
var_dump($datetime->format('Y-m-d H:i:s'));
输出
string(19) "2018-10-23 00:00:00"
string(19) "2018-10-23 20:20:00"
使用DateTimeImmutable
:https://3v4l.org/oRehh
如果要将 DateTime
增加 20 小时 20 分钟:
$date = new \DateTime('17.03.2016');
$date->add($new \DateInterval('PT20H20M'));
您不需要获得 add()
的结果,在 DateTime
对象上调用 add()
会改变它。 add()
的 return 值是 DateTime
对象本身,因此您可以链接方法。
请参阅 DateInterval::__construct 了解如何设置间隔。
在 PHP 中添加日期和时间字符串的 "cleanest" 方法是什么?
虽然读到 DateTime::add
期望 DateInterval
,但我尝试了
$date = new \DateTime('17.03.2016');
$time = new \DateTime('20:20');
$result = $date->add($time);
这不好,什么也没返回给 $result
。
要从 '20:20'
制作 DateInterval
,我只找到了非常复杂的解决方案...
也许我应该使用时间戳?
$date = strtotime($datestring);
$timeObj = new \DateTime($timestring);
// quirk to only get time in seconds from string date
$time = $timeObj->format('H') * 3600 + $timeObj->format('i') * 60 + $timeObj->format('s');
$datetime = $date+$time;
$result = new \DateTime;
$result->setTimestamp($datetime);
在我的例子中,这是 returns 想要的结果,具有正确的时区偏移。但是你怎么看,这算健壮吗?有没有更好的方法?
DateTime
(和 DateTimeImmutable
)有一个 modify
方法,您可以利用该方法通过添加 20 hours
和 20 minutes
来修改时间。
已更新
我已经根据评论包含了 DateTime
和 DateTimeImmutable
的示例,您不需要将 modify
的结果分配给变量,因为它会发生变异原始对象。而 DateTimeImmutable
创建一个新实例并且不会改变原始对象。
日期时间
<?php
$start = new DateTimeImmutable('2018-10-23 00:00:00');
echo $start->modify('+20 hours +20 minutes')->format('Y-m-d H:i:s');
// 2018-10-23 20:20:00
使用DateTime
:https://3v4l.org/6eon8
DateTimeImmutable
<?php
$start = new DateTimeImmutable('2018-10-23 00:00:00');
$datetime = $start->modify('+20 hours +20 minutes');
var_dump($start->format('Y-m-d H:i:s'));
var_dump($datetime->format('Y-m-d H:i:s'));
输出
string(19) "2018-10-23 00:00:00"
string(19) "2018-10-23 20:20:00"
使用DateTimeImmutable
:https://3v4l.org/oRehh
如果要将 DateTime
增加 20 小时 20 分钟:
$date = new \DateTime('17.03.2016');
$date->add($new \DateInterval('PT20H20M'));
您不需要获得 add()
的结果,在 DateTime
对象上调用 add()
会改变它。 add()
的 return 值是 DateTime
对象本身,因此您可以链接方法。
请参阅 DateInterval::__construct 了解如何设置间隔。