3v4l.org

run code in 300+ PHP versions simultaneously
<?php declare(strict_types=1); error_reporting(E_ALL); function check( string $label, ?int $constructor, ?int $setTimestamp, string $initTimezone, string $expected, int $expectedOffset ): bool { date_default_timezone_set($initTimezone); $dt = $constructor === null ? new \DateTimeImmutable() : new \DateTimeImmutable('@' . $constructor); if ($setTimestamp !== null) { $dt = $dt->setTimestamp($setTimestamp); } $formatted = $dt->format(\DateTimeInterface::RFC2822); $dtOffset = $dt->getOffset(); $valid = ( $formatted === $expected && $dtOffset === $expectedOffset && $dt->getTimestamp() === ($setTimestamp ?? $constructor ?? '') ); echo '--------------------------------------------------------------' . PHP_EOL; echo 'LABEL.....: ' . $label . PHP_EOL; echo 'INIT_TZ...: ' . $initTimezone . PHP_EOL; echo 'DT_OFFSET.: ' . $dtOffset . PHP_EOL; echo 'EXP_OFFSET: ' . $expectedOffset . PHP_EOL; echo 'EXPECTED..: ' . $expected . PHP_EOL; echo 'FORMATTED.: ' . $formatted . PHP_EOL; echo 'IS_VALID..: ' . ($valid ? 'Y' : 'N') . PHP_EOL; echo '--------------------------------------------------------------' . PHP_EOL; echo PHP_EOL; return $valid; } // 'D, d M Y H:i:s O' // TIME 1712171982 // GMT Wed Apr 03 2024 19:19:42 GMT+0000 // MSZ Wed Apr 03 2024 21:19:42 GMT+0200 (Mitteleuropäische Sommerzeit) $utcUnixTimestamp = 1712171982; $checks = [ // UTC [ 'constructor' => $utcUnixTimestamp, 'setTimestamp' => null, 'initTimezone' => 'UTC', 'expected' => 'Wed, 03 Apr 2024 19:19:42 +0000', 'expectedOffset' => 0, ], [ 'constructor' => null, 'setTimestamp' => $utcUnixTimestamp, 'initTimezone' => 'UTC', 'expected' => 'Wed, 03 Apr 2024 19:19:42 +0000', 'expectedOffset' => 0, ], // Europe/Berlin [ 'constructor' => $utcUnixTimestamp, 'setTimestamp' => null, 'initTimezone' => 'Europe/Berlin', 'expected' => 'Wed, 03 Apr 2024 19:19:42 +0000', 'expectedOffset' => 0, ], [ 'constructor' => null, 'setTimestamp' => $utcUnixTimestamp, 'initTimezone' => 'Europe/Berlin', 'expected' => 'Wed, 03 Apr 2024 21:19:42 +0200', 'expectedOffset' => 7200, // 2 * 60 * 60 ], // Canada/Atlantic [ 'constructor' => $utcUnixTimestamp, 'setTimestamp' => null, 'initTimezone' => 'Canada/Atlantic', 'expected' => 'Wed, 03 Apr 2024 19:19:42 +0000', 'expectedOffset' => 0, ], [ 'constructor' => null, 'setTimestamp' => $utcUnixTimestamp, 'initTimezone' => 'Canada/Atlantic', 'expected' => 'Wed, 03 Apr 2024 16:19:42 -0300', 'expectedOffset' => -10800, // -3 * 60 * 60 ], ]; $total = 0; $failed = 0; foreach ($checks as $check) { $total++; extract($check, EXTR_OVERWRITE); $label = sprintf( '#%s TZ: %s CONSTRUCTOR: %s SETTIMESTAMP: %s', $total, $initTimezone, ($constructor === null ? 'N' : 'Y'), ($setTimestamp === null ? 'N' : 'Y') ); if (!check($label, $constructor, $setTimestamp, $initTimezone, $expected, $expectedOffset)) { $failed++; } } echo PHP_EOL; echo "TOTAL.: " . $total . PHP_EOL; echo "FAILED: " . $failed . PHP_EOL; echo PHP_EOL;

preferences:
80.34 ms | 408 KiB | 5 Q