我正在解决以下任务>
我有两个约会 - $ start和$ end以及目标年份为$ year。
日期是php DateTime对象,year是字符串。
添加:日期来自MySql字段,来自此格式2017-02-01 15:00:00 ... add2:如果结束日期为null,我使用今天的日期......
我需要弄清楚特定年份这两个日期之间的天数。
此外,我需要将它整整一整天,即使一天中的一分钟应算作一整天......
我可以通过许多跟随ifs解决它。
我在示例中使用的值的预期结果是 2016年是0天 2017年是31天 2018年是32天 2019年是0天
但是有没有优雅的PHP功能可以帮助我这个? 我做了什么似乎是错误的方式,并给出了不好的结果 - 似乎只有整整几天......
请在此处查看我的代码>
<?php
$diff = True;
$start = DateTime::createFromFormat('Y-m-d H:i:s','2017-12-01 23:05:00');
$end = DateTime::createFromFormat('Y-m-d H:i:s','2017-12-03 00:05:00');
$year = '2017';
// start date
if ($start->format('Y')<$year)
{
$newstart = new DateTime('first day of January '. $year);
}
if ($start->format('Y')==$year)
{
$newstart = $start;
}
if ($start->format('Y')>$year)
{
$result = 0;
$diff = False;
}
// end date
if ($end->format('Y')>$year)
{
$newend = new DateTime('last day of December '. $year);
}
if ($end->format('Y')==$year)
{
$newend = $end;
}
if ($end->format('Y')<$year)
{
$result = 0;
$diff = False;
}
// count if diff is applicable
if ($diff)
{
$result = $newend->diff($newstart)->format("%a");
}
echo $result;
?>
答案 0 :(得分:1)
但是有没有优雅的PHP功能可以帮助我解决这个问题?
了解DateTime::diff()
。它会返回一个DateInterval
对象,其中包含天数($days
),并检查$h
,$i
和$s
的值,您可以判断你必须增加它来舍入结果。您还可以使用min()
和max()
来缩短所需年份的时间间隔。
function getDays(DateTimeInterface $start, DateTimeInterface $end, $year)
{
// Extend the start date and end date to include the entire day
$s = clone $start; // Don't modify $start and $end, use duplicates
$s->setTime(0, 0, 0);
$e = clone $end;
$e->setTime(0, 0, 0)->add(new DateInterval('P1D')); // start of the next day
// Crop the input interval to the desired year
$s = min($s, new DateTime("$year-01-01 00:00:00"));
$year ++;
$e = max(new DateTime("$year-01-01 00:00:00"), $end); // start of the next year
if ($e <= $s) {
// The input interval does not span across the desired year
return 0;
}
// Compute the difference and return the number of days
$diff = $e->diff($s);
return $diff->days;
}
答案 1 :(得分:0)
Auth::user
只需确保并且只有日期部分,您就不应该处理四舍五入。