Rumah > Soal Jawab > teks badan
P粉5305192342023-08-01 09:41:04
Saya secara peribadi lebih suka menggunakan objek peringkat tinggi dan bukannya tatasusunan atau rentetan sahaja, jadi beginilah cara saya mendekatinya. Ini mungkin berlebihan bagi sesetengah orang, yang saya faham sepenuhnya, tetapi kaedah teras juga boleh ditulis semula dengan mudah sebagai fungsi global, jadi mudah-mudahan ini boleh diambil kira.
Saya rasa secara keseluruhannya ia sangat mudah dan mudah, hampir sama dengan kod anda, kecuali selepas membelah kami menukarnya kepada integer dan kemudian mengesahkan bahawa jam itu berada dalam julat yang dijangkakan.
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); } }
Penggunaan:
var_dump(MySqlTime::fromMySqlTimeAsDurationInDay('12:34:56')->toDateTime());
Keluaran:
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