Skip to main content
Anywhere a script knows about a moment in time ({user.joined_at}, {expiration}, {nuke.next}) or a length of time ({duration}, {nuke.interval}), you get the same full set of suffixes. Learn it once and it works everywhere.
Nothing here is opt-in. If a variable is a date or a duration, every suffix on this page works on it — including ones added to the bot after you read this.

Dates and times

The bare variable is a raw Unix timestamp — a plain number like 1618935600. That’s deliberate: it’s the one form you can build anything else out of.

Let Discord do it

Discord renders <t:NUMBER:STYLE> in everyone’s own timezone and language. Drop the bare variable in and pick a style letter:

Or use a named suffix

Every style above also has a name, so you don’t have to remember the letters:
Use the named suffix when you just want a date on screen. Use the bare number with <t:…:X> when you’re mixing several styles in one line, or when you want a style Discord supports that hasn’t been given a name.

Raw parts

For arithmetic or odd formats, the individual components are there too:
.year .month .day .hour .minute .second .microsecond

Durations

A length of time — how long a mute lasts, how often a channel is nuked. The bare variable is the long, readable form:
muted for 2h — back in 2 hours
The numeric suffixes are whole numbers, rounded down, counting the total in that unit — a 90 minute duration is 90 minutes and 1 hour, not 1 hour and 30 minutes. Combine with operators when you want the number formatted: {duration.seconds|comma}.

Where they show up

Some of the more useful ones. Each module’s own variables subcommand lists the rest.
Available in invoke messages, invoke DMs, and the jail message.
See scheduled nukes.

Gotchas

You used the bare variable on its own. That’s the raw Unix value — wrap it: <t:{expiration}:R>, or switch to a named suffix: {expiration.relative}.
That variable doesn’t exist in this context. Suffixes only work on something that’s already a date or duration — {user.name.relative} is meaningless, and so is a variable the module never provides. Check the module’s variables subcommand.
Intentional. {duration} is Permanent and {expiration} is Never when there’s no end date, and every suffix gives the same word, so <t:{expiration}:R> would render <t:Never:R>. Branch on it instead:
They aren’t — Discord renders <t:…> in each viewer’s own timezone, so the same message reads correctly for everyone. .iso is the exception: it’s always UTC.