在某些情况下,我想在DATETIME格式化变量的值上加上1天:
$start_date = date('Y-m-d H:i:s', strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}"));
做这个的最好方式是什么?
Answers:
如果要在PHP中执行此操作:
// replace time() with the time stamp you want to add one day to
$startDate = time();
date('Y-m-d H:i:s', strtotime('+1 day', $startDate));
如果要在MySQL中添加日期:
-- replace CURRENT_DATE with the date you want to add one day to
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY);
time()
为strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}")
。
使用PHP 5.2中引入的DateTime可以实现这一目标的方法不止一种。与使用strtotime()
此方法不同,它将考虑夏令时和and年。
$datetime = new DateTime('2013-01-29');
$datetime->modify('+1 day');
echo $datetime->format('Y-m-d H:i:s');
// Available in PHP 5.3
$datetime = new DateTime('2013-01-29');
$datetime->add(new DateInterval('P1D'));
echo $datetime->format('Y-m-d H:i:s');
// Available in PHP 5.4
echo (new DateTime('2013-01-29'))->add(new DateInterval('P1D'))->format('Y-m-d H:i:s');
// Available in PHP 5.5
$start = new DateTimeImmutable('2013-01-29');
$datetime = $start->modify('+1 day');
echo $datetime->format('Y-m-d H:i:s');
+2 day
或+2 days
(显然+2 days
在语义上更正确)
该日期时间的构造函数需要一个参数string time
。$time
可以是不同的东西,它必须尊重datetime格式。
有一些有效值作为示例:
'now'
(默认值)2017-10-19
2017-10-19 11:59:59
2017-10-19 +1day
因此,您可以使用以下方法。
$dt = new \DateTime('now +1 day'); //Tomorrow
$dt = new \DateTime('2016-01-01 +1 day'); //2016-01-02
strtotime
的字符串转换为时间戳例如:
$time = strtotime($myInput);
$newTime = $time + 86400;
如果仅增加1天,则再次使用strtotime可能会过头。
date()
考虑使用当地时区转换时,将考虑夏令时。
我建议从Zend Framework开始使用Zend_Date类。我知道,这有点题外话,但是我会这样:-)
$date = new Zend_Date();
$date->add('24:00:00', Zend_Date::TIMES);
print $date->get();
您可以按以下方式使用。
$start_date = date('Y-m-d H:i:s');
$end_date = date("Y-m-d 23:59:59", strtotime('+3 days', strtotime($start_date)));
您还可以将天设置为常数,并按如下所示使用。
if (!defined('ADD_DAYS')) define('ADD_DAYS','+3 days');
$end_date = date("Y-m-d 23:59:59", strtotime(ADD_DAYS, strtotime($start_date)));
有一种更简洁直观的方法可以将天数添加到php日期中。不要误会我的意思,这些php表达式很棒,但是您始终必须通过Google搜索如何对待它们。我想念自动补全功能。
这是我喜欢处理这些情况的方式:
(new Future(
new DateTimeFromISO8601String('2014-11-21T06:04:31.321987+00:00'),
new OneDay()
))
->value();
对我来说,这是一种更直观,自动完成的方式。无需每次都用Google搜索解决方案。
作为一个不错的好处,您不必担心格式化结果值,它已经是ISO8601格式。
这是酥皮库,还有更多的例子在这里。