Epoch Time vs ISO 8601: Key Differences and When to Use Each

May 28, 20266 min read

Two Ways to Represent Time

Epoch time and ISO 8601 are the two dominant formats for representing dates and times in software. They serve different purposes, and choosing the wrong one creates interoperability headaches, timezone bugs, and debugging difficulties.

Epoch time (also called Unix time or POSIX time) counts the number of seconds since January 1, 1970, 00:00:00 UTC. ISO 8601 is a string format that represents dates and times in a human-readable, globally standardized way.

// Same moment, two representations
const epoch = 1716873600;                    // Unix timestamp
const iso   = '2024-05-28T00:00:00Z';        // ISO 8601 string

Epoch Time: Compact and Calculable

Advantages

Epoch timestamps are integers. This makes them trivial to compare, sort, subtract, and store:

// Time difference in seconds
const start = 1716873600;
const end   = 1716877200;
const elapsed = end - start; // 3600 seconds = 1 hour

// Compare timestamps
if (tokenExpireEpoch > currentEpoch) {
  // token still valid
}

Limitations

  • Not human-readable: 1716873600 tells you nothing without conversion
  • Timezone-free by design: Always UTC, which is an advantage for storage but requires conversion for display
  • 32-bit overflow: Traditional 32-bit signed integers overflow on January 19, 2038 (the "Year 2038 problem")
  • No sub-second precision in basic form: Milliseconds require decimal notation (1716873600.123)

When to Use Epoch

ScenarioWhy Epoch Works
API rate-limit timestampsEasy subtraction and comparison
JWT exp and iat claimsCompact integer in token payload
Log file timestampsFast to write and sort
Cache expirationSimple numeric comparison
Database time columns (performance-critical)Smaller storage, faster indexes

ISO 8601: Readable and Unambiguous

Advantages

ISO 8601 strings are self-documenting. A developer reading 2024-05-28T14:30:00+02:00 immediately understands the date, time, and timezone offset:

// ISO 8601 variants
'2024-05-28'                    // Date only
'2024-05-28T14:30:00Z'          // UTC time
'2024-05-28T14:30:00+02:00'     // Time with offset
'2024-05-28T14:30:00.123Z'      // With milliseconds

Limitations

  • Larger storage: 20-28 bytes vs 4-8 bytes for an integer
  • Slower comparison: String comparison works only when offsets are normalized to UTC
  • Parsing overhead: Requires a date library for reliable cross-browser parsing
  • Timezone ambiguity without offset: 2024-05-28T14:30:00 without Z or offset is "local time" — interpreted differently depending on the runtime

When to Use ISO 8601

ScenarioWhy ISO 8601 Works
REST API request/response bodiesHuman-readable, self-documenting
Configuration filesEasy for humans to write and verify
Database datetime columnsBetter query readability
Email headers and document metadataStandardized and internationally understood
Frontend displayDirectly formattable for users

Converting Between Formats

JavaScript

// Epoch to ISO 8601
const iso = new Date(1716873600 * 1000).toISOString();
// "2024-05-28T00:00:00.000Z"

// ISO 8601 to Epoch
const epoch = Math.floor(new Date('2024-05-28T00:00:00Z').getTime() / 1000);
// 1716873600

// Current time in both formats
const now = Date.now(); // epoch milliseconds
const nowISO = new Date().toISOString();

Python

import datetime

# Epoch to ISO 8601
dt = datetime.datetime.fromtimestamp(1716873600, tz=datetime.timezone.utc)
iso = dt.isoformat()  # "2024-05-28T00:00:00+00:00"

# ISO 8601 to Epoch
epoch = int(dt.timestamp())  # 1716873600

Common Pitfalls

Mixing Epoch Seconds and Milliseconds

JavaScript's Date.now() returns milliseconds. Many APIs expect seconds. Off by a factor of 1000, your timestamps are either in 1970 or thousands of years in the future.

// Common bug
const ms = Date.now();          // 1716873600000
const secs = Math.floor(ms / 1000); // 1716873600 — correct for APIs expecting seconds

ISO 8601 Without Timezone

An ISO string without Z or an offset is treated as local time. This produces different results on servers in different timezones:

// Dangerous — interpreted as local time
new Date('2024-05-28T14:30:00');

// Safe — explicitly UTC
new Date('2024-05-28T14:30:00Z');

Key Takeaways

  • Epoch time is a compact integer representing seconds since 1970-01-01 UTC — ideal for computation and storage
  • ISO 8601 is a human-readable string — ideal for APIs, configuration, and display
  • Always include timezone information in ISO 8601 strings to avoid interpretation differences
  • Watch for the seconds vs milliseconds mismatch when working with Unix timestamps in JavaScript
  • Use epoch for JWT claims, log timestamps, and rate limiting; use ISO 8601 for API payloads and configuration

Try It Yourself

Convert between epoch time and ISO 8601 instantly with our free Timestamp Converter. Enter any Unix timestamp to see its ISO 8601 equivalent, or paste an ISO string to get the epoch value — all processed locally in your browser.

Try the Timestamp Converter →