The Year 2038 problem

At 03:14:08 UTC on January 19, 2038, every system that stores Unix time in a signed 32-bit integer overflows and wraps back to December 13, 1901. Check a date below, or read what breaks and how to fix it.

What is the Year 2038 problem?

Unix time counts seconds elapsed since 1970-01-01T00:00:00Z, the epoch. Many systems — older Unix and Linux kernels, C libraries, embedded firmware, and some database columns — store that count in a signed 32-bit integer. Thirty-two signed bits can only count up to 2,147,483,647. Add one more second and the value overflows, the same way an odometer rolls from 999999 back to 000000. This is the 32-bit sibling of the Y2K bug, and it is sometimes called Unix Millennium Bug or the Y2K38 problem.

Why 32-bit signed integers overflow

A signed 32-bit integer reserves its top bit for sign, leaving 31 bits of magnitude — a range of -2,147,483,648 to 2,147,483,647. The Unix epoch counter reaches its ceiling, 2,147,483,647, at 03:14:07 UTC on January 19, 2038. The next tick does not stop or error; it wraps to the most negative value the type can hold, -2,147,483,648, which decodes as December 13, 1901, 20:45:52 UTC. Watch the current Unix timestamp climb and you are watching the counter approach that ceiling in real time — it is past 1.78 billion already. How much room is left is one subtraction against 2147483647, which the timestamp calculator will do for you in days and hours rather than in seconds.

// What overflow looks like in a 32-bit signed timestamp
2147483647   // 2038-01-19T03:14:07Z  — last valid second
2147483648   // 2038-01-19T03:14:08Z  — overflows to -2147483648 → 1901-12-13T20:45:52Z

What actually breaks

A wrapped clock does not fail loudly — it produces a plausible but wrong date, which is what makes this class of bug expensive. Depending on the system, a rollover can show up as:

It is the same shape of failure as the 1970 epoch-zero bug covered on the epoch bug debugger — a timestamp lands somewhere it should not — except the cause is a fixed-width overflow rather than a null or a unit mismatch, and the destination is 1901 instead of 1970.

How to fix it

There is no single patch, because the bug can live in the OS, the language runtime, a database schema, or firmware that no one maintains anymore:

Frequently asked questions

When exactly does the Year 2038 problem happen?

At 03:14:07 UTC on January 19, 2038, the Unix clock reaches 2,147,483,647 — the largest value a signed 32-bit integer can hold. One second later it overflows and wraps to -2,147,483,648, which decodes as December 13, 1901.

Am I affected if my code uses 64-bit timestamps?

No. A signed 64-bit time_t can represent dates roughly 292 billion years in the future, so the year 2038 boundary never applies to it. Most 64-bit operating systems already default to a 64-bit time_t. The risk is in 32-bit systems, older embedded and industrial hardware, and any database column or file format explicitly declared as a 32-bit integer.

Does this affect JavaScript timestamps or millisecond epochs?

Not on its own. JavaScript's Date stores milliseconds since the epoch as a 64-bit floating-point number, safe until the year 275,760 — far past 2038. The overflow only happens where a timestamp is explicitly stored as a signed 32-bit integer, such as a C time_t, a 32-bit database column, or a binary file format.

How do I fix the Year 2038 problem?

Move the affected value to a 64-bit signed integer (or an unsigned 32-bit one if you only need until 2106), upgrade the OS, kernel, and C library on 32-bit systems to a 2038-safe release, and widen any database column, file format, or network protocol field that stores time as a 32-bit integer. Firmware on embedded and industrial hardware often needs a vendor update or physical replacement, since it cannot be patched in place.