php日期时间差异-是否将两个日期都包含在范围内?

php日期时间差异-是否将两个日期都包含在范围内?,php,datetime,Php,Datetime,我一直在使用DateTime Diff(在php中)来获取日期对的各种设置—要显示的两个格式化日期、与当前日期的差异(例如“开始日期是3个月2天前”),以及两个日期之间的长度(“长度是2个月3天”) 问题是DateTime Diff忽略了其中一天,因此如果开始是昨天,结束是明天,则给出2天,而我想要3天,因为这两个日期都应该包含在长度中。如果只是天,我可以简单地在结果中添加1,但我想使用Diff的年/月/天结果,这些结果在构建时确定 我发现获得所需结果的唯一方法是为开始和结束创建日期时间(以获得

我一直在使用DateTime Diff(在php中)来获取日期对的各种设置—要显示的两个格式化日期、与当前日期的差异(例如“开始日期是3个月2天前”),以及两个日期之间的长度(“长度是2个月3天”)

问题是DateTime Diff忽略了其中一天,因此如果开始是昨天,结束是明天,则给出2天,而我想要3天,因为这两个日期都应该包含在长度中。如果只是天,我可以简单地在结果中添加1,但我想使用Diff的年/月/天结果,这些结果在构建时确定

我发现获得所需结果的唯一方法是为开始和结束创建日期时间(以获得格式化的日期和差异)。然后取结束日期时间,加上1天,然后计算出长度

这有点笨拙,但似乎无法告诉DateTime Diff在结果中同时包含开始日期和结束日期。

封装了特定的时间点。“昨天”不是一个瞬间,而是一个时间范围。“明天”也一样

不要忽视任何事情;它只提供了两个时刻之间的精确差异(以天、小时、分钟为单位)

如果您想将“明天”和“昨天”之间的差值设为“3天”,您可以从中减去“昨天”的第一秒(在“明天”的最后一秒之后的第二秒)

像这样:

// Always set the timezone of your DateTime objects to avoid troubles
$tz = new DateTimeZone('Europe/Bucharest');
// Some random time yesterday
$date1 = new DateTime('2016-07-08 21:30:15', $tz);
// Other random time tomorrow
$date2 = new DateTime('2016-07-10 12:34:56', $tz);

// Don't mess with $date1 and $date2;
// clone them and do whatever you want with the clones
$yesterday = clone $date1;
$yesterday->setTime(0, 0, 0);         // first second of yesterday (the midnight)
$tomorrow = clone $date2;
$tomorrow->setTime(23, 59, 59)               // last second of tomorrow
         ->add(new DateInterval('PT1S'));    // one second

// Get the difference; it is the number of days between and including $date1 and $date2
$diff = $tomorrow->diff($yesterday);

printf("There are %d days between %s and %s (including the start and end date).\n",
     $diff->days, $date1->format('Y-m-d'), $date2->format('Y-m-d')
);

到目前为止,没有。同样的事情也适用于DatePeriod。这当然是一个缺点,但正如您已经知道的,它是可以克服的。您可以使用DateTimeImmutable代替克隆。当涉及到更改时,使用
DateTimeImmutable
的“随心所欲”部分会无声地创建新对象。尽管如此,使用<代码> DATITEMIGIVABLE < /COD>尽可能是一个很好的建议,特别是当DATETIME对象是函数参数时,是的,我认为DATETIME对象是值对象,所以我更喜欢它们是不可变的,我曾经有几次因为可变日期时间对象创建了奇怪的bug而陷入麻烦,直到我对它们有了更多的经验:)