Timestamps and the Unix Epoch

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.

One instant in three zones and the 2038 boundary (epoch.php)PHP
<?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";
Output
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).