PHP:计算事件发生后的天数和午夜后的秒数
PHP: calculate days since event and seconds since midnight
这是一个由两部分组成的问题,应该是微不足道的,但是 PHP 中的日期和时间处理似乎什么都不是,到目前为止我尝试过的所有方法要么给出了不正确的结果,要么使我的程序崩溃了
我正在尝试在 PHP
中复制以下两个 SQL 服务器命令
数一数千禧年以来的天数
select (cast (DATEDIFF(day,'2000-01-01',getdate()) as int)
计算自午夜以来的秒数
datediff(second,convert(date,getdate()),getdate())
我已经尝试了 date_diff、getdate、strotime 等的所有组合,但似乎没有任何东西能给我一个正确的 ISO 格式的日期时间或计算经过的天数和秒数的可行方法。
我正在使用 PHP7,所以所有内置函数应该都是最新的。
我错过了什么?
编辑:示例输入数据。
- 今天的日期,格式为“2020-11-22 16:57:10.112”
格式为 '2000-01-01 00:00:00.000'
的给定日期
预期输出数据:7631 天
- 今天的日期,格式为“2020-11-22 16:57:10.112”
格式为 '2020-11-22 00:00:00.000'
的前一个午夜
预期输出数据: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
;
}
这是一个由两部分组成的问题,应该是微不足道的,但是 PHP 中的日期和时间处理似乎什么都不是,到目前为止我尝试过的所有方法要么给出了不正确的结果,要么使我的程序崩溃了
我正在尝试在 PHP
中复制以下两个 SQL 服务器命令数一数千禧年以来的天数
select (cast (DATEDIFF(day,'2000-01-01',getdate()) as int)
计算自午夜以来的秒数
datediff(second,convert(date,getdate()),getdate())
我已经尝试了 date_diff、getdate、strotime 等的所有组合,但似乎没有任何东西能给我一个正确的 ISO 格式的日期时间或计算经过的天数和秒数的可行方法。
我正在使用 PHP7,所以所有内置函数应该都是最新的。
我错过了什么?
编辑:示例输入数据。
- 今天的日期,格式为“2020-11-22 16:57:10.112” 格式为 '2000-01-01 00:00:00.000' 的给定日期
预期输出数据:7631 天
- 今天的日期,格式为“2020-11-22 16:57:10.112” 格式为 '2020-11-22 00:00:00.000' 的前一个午夜
预期输出数据: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
;
}