Maison > Questions et réponses > le corps du texte
P粉5305192342023-08-01 09:41:04
Personnellement, je préfère utiliser des objets de haut niveau plutôt que de simples tableaux ou chaînes, c'est donc ainsi que j'aborde les choses. Cela peut être excessif pour certains, ce que je comprends parfaitement, mais les méthodes de base peuvent également être facilement réécrites en tant que fonctions globales, donc j'espère que cela sera pris en compte.
Je pense que dans l'ensemble, c'est très simple et direct, presque identique à votre code, sauf qu'après le fractionnement, nous le convertissons en entier puis vérifions que l'heure se situe dans la plage attendue.
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); } }
Utilisation :
var_dump(MySqlTime::fromMySqlTimeAsDurationInDay('12:34:56')->toDateTime());
Sortie :
object(DateTimeImmutable)#3 (3) { ["date"]=> string(26) "2023-07-31 12:34:56.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "Europe/Amsterdam" }
Démo : https://3v4l.org/B6mr4#v8.2.7