【问题标题】:Calculate minutes in a date interval AM minutes PM minutes in PHP计算日期间隔中的分钟 AM 分钟 PHP 中的 PM 分钟
【发布时间】:2021-03-28 11:25:20
【问题描述】:

PHP 中是否有任何内置函数可以计算日期时间间隔中上午和下午时间的分钟数(使用 24 小时格式)。假设我们有:

$start_date = '2021-03-30 11:30:00';
$end_date = '2021-03-30 12:30:00';

所以它会输出:

$AM = 30;
$PM = 30;

另一个例子:

$start_date = '2021-03-30 10:00:00';
$end_date = '2021-03-30 13:30:00';

应该输出:

$AM = 120;
$PM = 90;

【问题讨论】:

  • @Gabriel 不,因为我不想转换日期,我只需要在 AM(以分钟为单位)和 PM(以分钟为单位)拆分日期时间差异。
  • 调查 Carbon (carbon.nesbot.com/docs)
  • @bt19 开始日期和结束日期会在同一天吗?如果没有,输出会是什么样子?
  • @Gabriel 无需为简单任务安装包。

标签: php date datetime


【解决方案1】:

从这些日期字符串创建DateTime 对象并手动创建mid_noon 变量日期时间对象。使用DateTime::diff 找出两个对象与mid_noon 的差异,并计算以分钟为单位的差异时间,如下所示:

<?php

$start_date = DateTime::createFromFormat('Y-m-d H:i:s','2021-03-30 10:00:00');
$end_date = DateTime::createFromFormat('Y-m-d H:i:s','2021-03-30 13:30:00');

$mid_noon = DateTime::createFromFormat('Y-m-d H:i:s',$start_date->format('Y-m-d'). ' 12:00:00');

$start_diff = $mid_noon->diff($start_date);
$end_diff = $end_date->diff($mid_noon);

$am = $start_diff->h * 60 + $start_diff->i;
$pm = $end_diff->h * 60 + $end_diff->i;

echo $am," ",$pm;

【讨论】:

  • @bt19 请注意:上述解决方案假定一个日期在中午之前或等于中午,而另一个日期在中午之后或等于中午。我希望我不是在猜测。
  • 嗨@nice_dev 在我的情况下,我的班次从下午 6 点到凌晨 2 点开始,但您的代码从下午 6 点到凌晨 12 点计算正确,但在 12 点后它失败了,您有什么解决方案吗?
  • @HamzaQureshi 你能把这个作为一个新问题发布吗?
【解决方案2】:

使用 strtotime 和一些小学数学的解决方案。

$am = intdiv(43200 - strtotime('2021-03-30 10:00:00')%86400,60);
$pm = intdiv(strtotime('2021-03-30 13:30:00')%86400 - 43200,60); 

strtotime 提供自 1970 年 1 月 1 日以来的秒数。使用 seconds%86400 我们得到午夜的秒数。 86400 是一整天的秒数。 43200 是半天或 12:00 的秒数。差异 43200 - secondsStart 和 secondsEnd - 43200 为我们提供了 AM 和 PM 的秒数。我们只需将其除以 60 即可得到分钟数。

以下带有DateTime extension dt 的变体更容易理解。

给定:

$start_date = '2021-03-30 10:00:00';
$end_date = '2021-03-30 13:30:00';

计算:

$day12h = dt::create($start_date)->setTime('12:00');

$am = dt::create($start_date)->diffTotal($day12h,'Minutes');
$pm = $day12h->diffTotal($end_date,'Minutes');

【讨论】:

  • 在我的情况下,我的班次从下午 6 点开始到凌晨 2 点,但您的代码从下午 6 点到凌晨 12 点计数正确,但在上午 12 点到凌晨 2 点后失败,您有什么解决方案吗?
猜你喜欢
  • 2019-09-28
  • 2011-10-04
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
相关资源
最近更新 更多