将一个 DateInterval 除以另一个

Posted

技术标签:

【中文标题】将一个 DateInterval 除以另一个【英文标题】:dividing one DateInterval by another 【发布时间】:2017-12-01 13:51:48 【问题描述】:

假设我有一个 DateInterval 是 1 年,另一个是 3 个月。

有没有可能一一相除得到4的答案,即1年的间隔有4个3个月的间隔?

【问题讨论】:

问题:您希望1 month divided by 7 days 返回什么? 可能有办法完成这项工作。您可以发布 2 或 3 个示例来说明您想要实现的目标吗?示例:var $datainterval = 4; $month = 3 结果 = 4。 @CarlosR 我认为您的意思是“实现”而不是“归档”。 ;D 【参考方案1】:

日期不易用于数学运算。我们可以做加法和减法,仅此而已。乘法没有什么意义(1 个月乘以 12 个月 = 1 平方年?)但除法可以理解为“这个区间有多少?”可以通过重复减法来实现。

now 创建一个DateTimeImmutableadd 您尝试对其执行除法的第一个间隔。然后,subtract 第二个间隔,直到您获得小于(或等于)原始DateTimeImmutable 的新日期/时间。计算这需要多少次。那是你的部门答案。

【讨论】:

【参考方案2】:

您可以尝试将您的 DateIntervals 转换为秒并除以:

$dateInterval1     = new DateInterval('P1Y');
$dateInterval2     = new DateInterval('P3M');
$dateInterval1Secs = date_create('@0')->add($dateInterval1)->getTimestamp();
$dateInterval2Secs = date_create('@0')->add($dateInterval2)->getTimestamp();

var_dump($dateInterval1Secs / $dateInterval2Secs);

当然,这个确实很精确,这段代码输出4.0555555555556

从Convert DateInterval object to seconds in php 转换为秒

【讨论】:

【参考方案3】:

直接不,因为DateInterval 是一个对象。根据this 回答,这样的事情可能会有所帮助

$y = new DateTime('@0');
$x = new DateTime('@0');
$secondsOfYear = $y->add(new DateInterval('P1Y'))->getTimestamp();
$secondsOfThreeMonths = $x->add(new DateInterval('P3M'))->getTimestamp();

print_r([$secondsOfYear,$secondsOfThreeMonths,(int)($secondsOfYear/$secondsOfThreeMonths)]);
// output
Array
(
    [0] => 31536000
    [1] => 7776000
    [2] => 4
)

查看PHP Sandbox

【讨论】:

以上是关于将一个 DateInterval 除以另一个的主要内容,如果未能解决你的问题,请参考以下文章

将一个矩阵除以另一个过日期

Oracle SQL - 将一个多行查询列除以另一个

如何将来自一个 SQL 选择的聚合值除以来自另一个 SQL 选择的聚合值?

将具有多索引的一个 DF 中的值除以另一个 DF 中的值并绘制结果

JAVA中一个float除以一个int变量,得到的结果精确到几位?

汇编 - 如何在汇编中将一个常数乘/除以另一个常数?