🧰 ToolPicoAll Tools →
HomeBlog › UUIDv7 / ULID Extractor

New: A UUIDv7 / ULID Timestamp Extractor Just Landed in the Epoch Converter

A previous guide on this blog flagged the UUIDv7 / ULID timestamp extractor as "not built yet — noted for context." That's no longer true. The mini-tool has shipped inside the Unix Timestamp Converter, and this post walks through what it does, how format detection works, and a couple of worked examples.

In this guide

What actually shipped

Short answerThe Unix Timestamp Converter's mini-tools section now includes a UUIDv7 / ULID timestamp extractor. Paste in a UUIDv7 or a ULID, pick the format (or leave it on auto-detect), and it decodes the embedded creation date-time — no server round-trip, no separate script.

This sits alongside the tool's existing mini-tools — the snowflake ID decoder, the date-range generator, and the duration calculator — as one more card in the same panel. If you've used any of those before, the layout will look immediately familiar: an input field, a format dropdown, and a result box that fills in once you run it.

Where to find itOpen the Unix Timestamp Converter, scroll to the "Mini tools" section, and look for the card labeled "UUIDv7 / ULID timestamp extractor." It ships with a sample UUIDv7 pre-filled so you can see it work immediately.

How the extractor reads a UUIDv7 or ULID

Short answerOn auto-detect, the tool inspects the input's shape — hyphenated 36-character hex for UUIDv7, or a 26-character Crockford base32 string with no hyphens for ULID — and decodes accordingly. You can also force either format from the dropdown if you already know which one you have.

UUIDv7 stores its 48-bit millisecond Unix timestamp in the first 48 bits of the identifier (roughly the first three hyphen-separated groups once the version nibble is accounted for). ULID takes a different approach: it Crockford-base32-encodes the same kind of millisecond timestamp into the leading 10 characters of a 26-character string, using an alphabet that deliberately excludes visually ambiguous characters like I, L, O, and U.

Because the two encodings look so different — one is grouped hex with hyphens, the other is a flat base32 string — the auto-detect logic doesn't need anything fancy: enough valid hex characters in the expected grouping means UUIDv7, otherwise it falls back to treating the string as a ULID. If the input doesn't cleanly parse as either, the tool reports that rather than guessing at a wrong date.

Format cheat sheet: UUIDv7 looks like 018f4c2e-1a2b-7c3d-8e4f-5a6b7c8d9e0f — 36 characters, hyphenated, hex digits, with a 7 as the first character of the third group. ULID looks like 01HN8X6ZKQ5J8VXENJ9M6XQZ3F — 26 characters, uppercase Crockford base32, no hyphens.

Worked examples

Both examples below are illustrative sample identifiers, not values pulled from a real system — swap in your own ID and confirm the decoded date matches your expectation before relying on it for anything important.

InputDetected formatDecoded timestamp (illustrative)
018f4c2e-1a2b-7c3d-8e4f-5a6b7c8d9e0fUUIDv7~2024-02, ms epoch from first 48 bits
01HN8X6ZKQ5J8VXENJ9M6XQZ3FULIDdecoded from leading 10 base32 chars

In each case, the extractor reads only the timestamp portion of the identifier — it doesn't (and can't) tell you anything about the random or sequence bits that make the rest of the ID unique. That's expected: those bits exist specifically so that two records created in the same millisecond still get distinct IDs, and there's no "date" hiding in them to extract.

Where this is actually useful

Short answerAnywhere a UUIDv7 or ULID is used as a primary key and you need to answer "when was this row created?" without joining to a separate created_at column — because, by design, the ID already encodes that answer.

Say (hypothetically) a support ticket references a record by its ULID primary key, and there's no timestamp column exposed in the tool you're looking at it through. Rather than tracing back to the database to find a created-at value, you can paste the ID straight into the extractor and read the creation date directly — that's the entire point of choosing a time-sortable ID format in the first place.

It's also handy for a quick sanity check during development: if you're generating UUIDv7 or ULID values in a new service and want to confirm the timestamp portion looks right (not, say, accidentally seconds instead of milliseconds, or a clock that's wildly off), pasting a freshly generated ID into the extractor is faster than writing a throwaway decoding script.

  • Recovering a rough creation date from a UUIDv7 or ULID primary key with no separate timestamp column.
  • Sanity-checking a new ID-generation library or service during development.
  • Comparing the embedded timestamp against the expected auto-detected format when you're not sure which one you have.

Decode the embedded creation date from a UUIDv7 or ULID identifier — plus the existing epoch converter, snowflake decoder, and more, all running in your browser.

Try the free Unix Timestamp Converter →

Frequently asked questions

What exactly is new in the Unix Timestamp Converter?
A UUIDv7 / ULID timestamp extractor mini-tool. Paste a UUIDv7 or a ULID identifier, choose the format (or leave it on auto-detect), and the tool decodes the embedded creation timestamp back into a readable date-time — entirely in your browser.
How does the extractor know whether I pasted a UUIDv7 or a ULID?
On auto-detect, the tool looks at the input's structure: a UUIDv7 is 36 characters with hyphens in the standard 8-4-4-4-12 UUID layout and hex digits, while a ULID is a 26-character Crockford base32 string with no hyphens. If the input has enough hex characters in UUID-like grouping it's treated as UUIDv7; otherwise it falls back to ULID decoding. You can also force either format manually from the dropdown.
Why would a UUID or a ULID contain a timestamp at all?
Both formats were designed so identifiers generated later sort after ones generated earlier, which classic random UUIDv4 values can't do. UUIDv7 packs a 48-bit millisecond Unix timestamp into its first 6 bytes; ULID encodes an equivalent millisecond timestamp as the first 10 characters of its Crockford base32 string. Embedding the time makes the ID itself time-sortable without a separate created_at index.
Is this the same as the existing snowflake ID decoder?
No — related idea, different mechanics. The snowflake decoder handles Discord- and Twitter/X-style integer IDs with a fixed platform epoch and a 22-bit left shift. The UUIDv7 / ULID extractor is a separate mini-tool because both formats use their own bit layout and character encoding: UUIDv7's timestamp sits in specific hex bytes, and ULID's sits in Crockford base32 characters, so each needs its own decoding logic.
Does pasting a UUID or ULID into the tool send it anywhere?
No. Like the rest of the converter, the extraction happens with JavaScript running in your browser tab. Nothing you type is transmitted to a server, which matters if the identifier you're inspecting comes from a production database row you'd rather not paste into a random third-party API.
A note on this guide: the UUIDv7 and ULID values shown above are illustrative sample identifiers used to demonstrate the decoding method, not statistics from any real dataset. This article is informational and does not replace verifying the decoded date against your own system or database records.