PHP:计算事件发生后的天数和午夜后的秒数

PHP: calculate days since event and seconds since midnight

这是一个由两部分组成的问题,应该是微不足道的,但是 PHP 中的日期和时间处理似乎什么都不是,到目前为止我尝试过的所有方法要么给出了不正确的结果,要么使我的程序崩溃了

我正在尝试在 PHP

中复制以下两个 SQL 服务器命令
  1. 数一数千禧年以来的天数

    select (cast (DATEDIFF(day,'2000-01-01',getdate()) as int) 
    
  2. 计算自午夜以来的秒数

    datediff(second,convert(date,getdate()),getdate())
    

我已经尝试了 date_diff、getdate、strotime 等的所有组合,但似乎没有任何东西能给我一个正确的 ISO 格式的日期时间或计算经过的天数和秒数的可行方法。

我正在使用 PHP7,所以所有内置函数应该都是最新的。

我错过了什么?

编辑:示例输入数据。

  1. 今天的日期,格式为“2020-11-22 16:57:10.112” 格式为 '2000-01-01 00:00:00.000'
  2. 的给定日期

预期输出数据:7631 天

  1. 今天的日期,格式为“2020-11-22 16:57:10.112” 格式为 '2020-11-22 00:00:00.000'
  2. 的前一个午夜

预期输出数据:61215 秒

如果您了解 DateTime,这将很容易做到:

function daysSinceStartOfMillennium(DateTimeImmutable $date): int
{
    $millenniumStart = new DateTimeImmutable('2000-01-01');

    return $date->diff($millenniumStart)->days;
}

function secondsSinceMidnightOfDate(DateTimeImmutable $date): int
{
    $midnightToday = new DateTimeImmutable('today');
    $diff = $date->diff($midnightToday);

    return $diff->s // seconds
        + $diff->i * 60 // minutes to seconds
        + $diff->h * 60 * 60 // hours to seconds
    ;
}

您还可以修改函数以将日期字符串作为参数并在其中创建 DateTime 对象。

我选择在 millennium 函数中创建一个描述性变量,以更好地传达解决方案。如果您愿意,可以省略此变量的创建,并将参数直接传递到 return 语句中:

return $date->diff(new DateTimeImmutable('2000-01-01'))->days;

请注意,如果您只需要对当前日期使用这些函数,可以将它们简化为不带参数:

function daysSinceStartOfMillennium(): int
{
    $millenniumStart = new DateTimeImmutable('2000-01-01');

    return (new DateTimeImmutable())->diff($millenniumStart)->days;
}

function secondsSinceMidnight(): int
{
    $midnightToday = new DateTimeImmutable('today');
    $diff = (new DateTimeImmutable())->diff($midnightToday);

    return $diff->s // seconds
        + $diff->i * 60 // minutes to seconds
        + $diff->h * 60 * 60 // hours to seconds
    ;
}