当前位置: 首页 > 知识库问答 >
问题:

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

梁宏才
2023-03-14

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

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

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

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

共有1个答案

龚俭
2023-03-14

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

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')
);
 类似资料:
  • 问题内容: 我试图得到两个日期时间之间的差异,并将其作为返回。我找到了使用示例,但似乎无法正确处理。 但是登录到我的数据库。这是因为我没有格式化totaltime变量吗? 问题答案: 我不确定您要寻找的格式有何不同,但这是使用DateTime的方法

  • 问题内容: 我的数据库中有以下一组匹配日期的日期(dd / MM / yyyy): 事件具有开始和结束日期(时间无关紧要),并且endDate为NULL表示事件仍在进行中。 我想确定的是两个任意日期之间的日期范围,其中a)没有事件,b)事件重叠。 因此,对于输入日期范围01/04/2009-30/06/2009,我希望得到以下结果: 注意,作为结果,两个相邻的重叠范围是可以接受的。 谁能用SQL算

  • 我需要得到以下两个日期之间的差异。两个日期都是字符串格式。

  • 问题内容: 给定以下日期: 和一个静态变量: 我需要创建一个数组,如: 周末除外。 不,这不是功课…出于某种原因,我今天无法直截了当。 问题答案: 对于PHP> = 5.3.0,请使用DatePeriod类。不幸的是,几乎没有记录。

  • 问题内容: 源表如下: 我想得到以下输出: 我必须使用循环来填充此表吗? 谢谢 问题答案: 您可以使用技巧来查询 演示

  • 问题内容: 我的问题类似于以下问题: http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::::P11_QUESTION_ID:14582643282111 区别在于我的内部查询返回两条记录,而我有外部查询。 我需要编写类似这样的内部查询,这将为我提供两个日期范围之间的日期列表(我正在尝试不执行此查询)。 我的内部查询返回以下2行: 所以我需要内部查