Apabila bekerja dengan tarikh dan masa dalam PHP, kita selalunya perlu melakukan pengiraan yang melibatkan selang tarikh. PHP menyediakan kelas DateInterval untuk mewakili tempoh masa. Walau bagaimanapun, menambah dua objek DateInterval adalah tidak mudah.
Isu timbul kerana PHP tidak menyokong lebihan muatan operator untuk objek. Akibatnya, menggunakan operator dengan objek DateInterval cuba menukarnya kepada rentetan, yang tidak disokong. Ini mengakibatkan tingkah laku yang tidak dijangka dan pengiraan yang salah.
Untuk menambah dua objek DateInterval, kita boleh menggunakan pendekatan berikut:
Berikut ialah contoh penuh:
<code class="php">$a = new DateTime('14:25'); $b = new DateTime('17:30'); $interval1 = $a->diff($b); echo "interval 1: " . $interval1->format("%H:%I"); echo "<br />"; $c = new DateTime('08:00'); $d = new DateTime('13:00'); $interval2 = $c->diff($d); echo "interval 2: " . $interval2->format("%H:%I"); echo "<br />"; $e = new DateTime('00:00'); $f = clone $e; $e->add($interval1); $e->add($interval2); echo "Total interval: " . $f->diff($e)->format("%H:%I") . "\n";</code>
Penyelesaian ini mencipta objek DateTime $e baharu dan menetapkannya kepada tengah malam (00:00). Kemudian, ia menambah objek DateInterval pertama dan kedua ($interval1 dan $interval2) kepada $e menggunakan kaedah tambah. Akhir sekali, ia mengira perbezaan antara titik rujukan asal ($f, yang juga tengah malam) dan $e yang dikemas kini untuk mendapatkan jumlah tempoh.
Untuk senario yang lebih kompleks, kita boleh melanjutkan kelas DateInterval untuk menentukan tingkah laku kita sendiri untuk menambah objek DateInterval. Ini membolehkan kami menyimpan tempoh dalam format yang lebih mudah dan melakukan pengiraan dengan lebih cekap.
Berikut ialah contoh kelas lanjutan:
<code class="php">class MyDateInterval extends DateInterval { public static function fromDateInterval(DateInterval $from) { return new MyDateInterval($from->format('P%yY%dDT%hH%iM%sS')); } public function add(DateInterval $interval) { foreach (str_split('ymdhis') as $prop) { $this->$prop += $interval->$prop; } } } $a = new DateTime('14:25'); $b = new DateTime('17:30'); $interval1 = $a->diff($b); echo "interval 1: " . $interval1->format("%H:%I") . "\n"; $c = new DateTime('08:00'); $d = new DateTime('13:00'); $interval2 = $c->diff($d); echo "interval 2: " . $interval2->format("%H:%I") . "\n"; $e = MyDateInterval::fromDateInterval($interval1); $e->add($interval2); echo "Total interval: " . $e->format("%H:%I") . "\n";</code>
Dalam contoh ini, kelas MyDateInterval memanjangkan DateInterval dan mengatasi kaedah tambah untuk mengumpul tempoh bagi setiap komponen (tahun, bulan, hari, jam, minit dan saat). Dengan menggunakan kelas lanjutan ini, kami boleh menambah objek DateInterval dengan lebih cekap dan mudah.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menambah dua objek DateInterval dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!