P粉5305192342023-08-01 09:41:04
我个人更喜欢使用高级对象而不仅仅是数组或字符串,所以这是我处理的方式。对于有些人来说,这可能有些过度,我完全理解,不过核心方法也可以很容易地重写为全局函数,希望这一点可以考虑到。
我认为整体上非常简单明了,几乎与您的代码完全相同,只是在分割后我们将其转换为整数,然后验证小时是否在预期范围内。
readonly class MySqlTime { public function __construct( public int $hours, public int $minutes, public int $seconds, ) { } public static function fromMySqlTimeAsDurationInDay(string $time): self { [$hours, $minutes, $seconds] = array_map('intval', explode(':', $time)); // Ensure only positive values on a single day. // MySql should already be throwing errors about minutes or seconds being out of range, so we don't // need to check those. // The seconds could include decimals, however for this purpose we are ignoring them. if ($hours > 23 || $hours < 0) { throw new InvalidArgumentException('Hours must be between 0 and 23'); } return new self($hours, $minutes, $seconds); } public function toDateTime(DateTimeInterface $dateTime = null) : DateTimeInterface { $dateTime ??= new DateTimeImmutable(); return $dateTime->setTime($this->hours, $this->minutes, $this->seconds); } }
用法:
var_dump(MySqlTime::fromMySqlTimeAsDurationInDay('12:34:56')->toDateTime());
输出:
object(DateTimeImmutable)#3 (3) { ["date"]=> string(26) "2023-07-31 12:34:56.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "Europe/Amsterdam" }
Demo: https://3v4l.org/B6mr4#v8.2.7