A Unix timestamp counts seconds since the epoch, 1970-01-01 00:00:00 UTC. It names an instant and has no time zone. time() returns it, microtime(true) adds microseconds, mktime() and gmmktime() build one from local or UTC fields, and date() formats one in the default zone (gmdate() in UTC). On 64-bit PHP it is an ordinary int, so dates before 1970 are negative and the 32-bit limit of 2038 is gone.
<?php
date_default_timezone_set('UTC');
echo time(), ' ', microtime(true), ' ', hrtime(true), "\n"; // "now": shows the run date
$ts = 1_790_000_000; // one fixed instant
foreach (['UTC', 'Asia/Kuala_Lumpur', 'America/New_York'] as $zone) {
$d = new DateTimeImmutable("@$ts")->setTimezone(new DateTimeZone($zone));
printf("%-18s %s %d\n", $zone, $d->format('Y-m-d H:i:s P'), $d->getTimestamp());
}
echo date('Y-m-d H:i', 0), ' | ', date('Y-m-d', -86_400 * 365), ' | ',
gmmktime(3, 14, 7, 1, 19, 2038), ' | ', date('Y-m-d H:i:s', 2 ** 31), ' | ',
DateTimeImmutable::createFromTimestamp(1790000000.25)->format('H:i:s.u'), "\n";1790149689 1790149689.5601 3914323633237 UTC 2026-09-21 14:13:20 +00:00 1790000000 Asia/Kuala_Lumpur 2026-09-21 22:13:20 +08:00 1790000000 America/New_York 2026-09-21 10:13:20 -04:00 1790000000 1970-01-01 00:00 | 1969-01-01 | 2147483647 | 2038-01-19 03:14:08 | 14:13:20.250000
The first line shows the run date, 23 September 2026. Time durations with hrtime(true), a monotonic nanosecond counter that never jumps when NTP corrects the clock. "@$ts" builds a date from a timestamp, and PHP 8.4's createFromTimestamp() also takes a float. MySQL 524 's TIMESTAMP column still ends at 2038-01-19 03:14:07 UTC (Date and Time Types).