> For the complete documentation index, see [llms.txt](https://docs.membercounter.app/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.membercounter.app/counters-reference/date.md).

# Date

Display the current date adjusted to your preferred timezone.

Shows today's date in the timezone you pick. Write the format yourself, for example `%D/%M/%Y` for `19/09/2026`.

**Availability:** every bot, no API key. Only the update cadence differs: every 10 minutes on the public bot, every 5 minutes on a [legacy premium](/custom-bot/legacy-premium-vs-custom-bot.md), [custom](/custom-bot/custom-bot.md) or [self-hosted](/self-hosting/self-hosting.md) bot. See [Configuration](/self-hosting/configuration.md).

<figure><img src="https://1582170640-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lu2S5r7lKtu4IK5ucu9%2Fuploads%2Fgit-blob-3911c8e7b68e46bd0ee88b43dc56b90b21fadc13%2Fcounter-date-options.png?alt=media" alt="Date options"><figcaption><p>The two options of the Date counter, with the <strong>Live preview</strong> underneath</p></figcaption></figure>

## Options

| Option            | What it does                                                          | Notes                                                                                                                                                                                                                                                                                                      |
| ----------------- | --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Timezone**      | The timezone the date is read in.                                     | The same presets the [Clock](/counters-reference/clock.md) counter uses. They carry friendly labels, such as **Madrid** for `Europe/Madrid`. You cannot type one that is missing: use a [nested counter](/using-the-dashboard/nested-counters.md) that returns an identifier such as `Asia/Tokyo` instead. |
| **Format**        | The text the counter prints, with the placeholders below substituted. | Free text. The default is `%f`. Also takes a nested counter that returns a formatting string.                                                                                                                                                                                                              |
| **Display label** | Renames the counter's chip in the editor.                             | Cosmetic. See [Formatting counters](/using-the-dashboard/customizing-counters.md#display-label).                                                                                                                                                                                                           |

{% hint style="warning" %}
**Leave Timezone empty and you get UTC**, so the date can flip a few hours early.
{% endhint %}

### Placeholders

| Placeholder | What it does                              | Example              |
| ----------- | ----------------------------------------- | -------------------- |
| `%Y`        | Full year                                 | `2026`               |
| `%y`        | 2-digit year                              | `26`                 |
| `%Ms`       | Full month name                           | `September`          |
| `%ms`       | Short month name                          | `Sep`                |
| `%M`        | Month number with leading zero (01-12)    | `09`                 |
| `%m`        | Month number (1-12)                       | `9`                  |
| `%Ws`       | Full day of week name                     | `Saturday`           |
| `%ws`       | Short day of week name                    | `Sat`                |
| `%w`        | Day of week number (0=Sunday, 6=Saturday) | `6`                  |
| `%D`        | Day with leading zero                     | `19`                 |
| `%d`        | Day without leading zero                  | `19`                 |
| `%f`        | Default locale-based formatting           | `September 19, 2026` |

The table shows Saturday 19 September 2026 with the `en-US` locale. `%f` never includes the time, so use a [Clock](/counters-reference/clock.md) counter for that. **Format** prints the rest as you type it, and an empty one falls back to `%f`. The placeholders are case-sensitive: `%Ms` is `September`, `%ms` is `Sep`. [Countdown](/counters-reference/countdown.md) has its own set.

## What it returns

Text, never a number, even when the format is only digits and slashes. A voice or category channel name still has to end up at least 2 characters long; see [Channel settings](/using-the-dashboard/channel-settings.md).

## Formatting

Only **Override default locale** matters here. It decides the language of `%f`, `%Ms`, `%ms`, `%Ws` and `%ws`, and which digits `%Y`, `%y`, `%M` and `%D` are written in. Names follow the locale, not the timezone. Without an override the counter follows [Server settings](/using-the-dashboard/server-settings.md), where the locale changes every counter in the server at once. A locale with non-Latin digits breaks `%m` and `%d`: `ar-EG` writes `%Y` as `٢٠٢٦` and `%D` as `١٩`, while the forms without a leading zero print the literal text `NaN`. See [Formatting counters](/using-the-dashboard/customizing-counters.md#override-default-locale).

## Refresh and caching

Just before midnight the date can already show tomorrow. The channel changes on the update cycle, so the new date lands at the first cycle after midnight. See [How counters update](/using-the-dashboard/how-counters-update.md).

## Examples

{% tabs %}
{% tab title="Weekday and month" %}
**Timezone** `Europe/Madrid`, **Format** `%Ws, %Ms %d` gives `Saturday, September 19`. For a short voice channel name, `📅 %ws %d %ms` gives `📅 Sat 19 Sep`. For a numeric date, `%D/%M/%Y` gives `19/09/2026` and `%M/%D/%Y` gives `09/19/2026`; swap `%D` for `%d` and `%M` for `%m` to drop the leading zeros. With **Override default locale** set to `es-ES`, `%f` gives `19 de septiembre de 2026`.

<figure><img src="https://1582170640-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lu2S5r7lKtu4IK5ucu9%2Fuploads%2Fgit-blob-cfc856f091a2f91f0e4d3a9723e68008adfa5212%2Fcounter-date-example-weekday.png?alt=media" alt="A voice channel showing the weekday and the date"><figcaption><p>The weekday and the date in a voice channel name</p></figcaption></figure>
{% endtab %}

{% tab title="Date and time together" %}
Combine with a [Clock](/counters-reference/clock.md) counter: `📅 {Date} · 🕒 {Clock}`, the Date counter with **Format** `%d %ms` and the Clock counter with `%H:%M`, gives `📅 19 Sep · 🕒 20:00`. Set the timezone on both; they do not share one.

<figure><img src="https://1582170640-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lu2S5r7lKtu4IK5ucu9%2Fuploads%2Fgit-blob-9f95dddb1ea08cd77d5de1ccd1f2b8eaf4af8025%2Fcounter-date-example-with-clock.png?alt=media" alt="A Date counter and a Clock counter in one template"><figcaption><p>A Date counter and a Clock counter side by side</p></figcaption></figure>
{% endtab %}
{% endtabs %}

## Errors

Date has no fallback. When it fails the bot renames the channel to **ERROR!**, translated into the server's language, and it does not put the old name back. More in [Troubleshooting](/using-the-dashboard/troubleshooting.md).

| Message                                                         | What to do                                                                                                                                     |
| --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| **ERROR!** in the channel name                                  | Check the **Timezone** value and the **Override default locale** tag. The dashboard only reports **An unknown error occurred.** for these two. |
| The result for the channel name is less than 2 characters long. | Put some text around the counter.                                                                                                              |

<details>

<summary>Technical details</summary>

* Evaluator: `packages/services/src/DataSource/DataSourceEvaluator/evaluators/date.ts`. Nothing is cached; the date is recomputed on every template evaluation.
* It rounds with `Math.round(Date.now() / coeff) * coeff` and `coeff = 1000 * 60 * 5`, exactly like [Clock](/counters-reference/clock.md), so the date flips up to 2 minutes 30 seconds before midnight in the chosen timezone.
* `%f` is `Intl.DateTimeFormat(locale, { year: "numeric", month: "long", day: "numeric", timeZone })`. `%Y`, `%M` and `%D` come from `formatToParts` with `year: "numeric", month: "2-digit", day: "2-digit"`, and `%y` is the last two characters of `%Y`.
* `%Ms`, `%ms`, `%Ws` and `%ws` are separate `Intl.DateTimeFormat` calls with `month: "long" / "short"` and `weekday: "long" / "short"`. `%w` is `new Date(rounded.toLocaleString("en-US", { timeZone })).getDay()`.
* Substitution runs `%f`, `%Y`, `%y`, `%Ms`, `%ms`, `%M`, `%m`, `%Ws`, `%ws`, `%w`, `%D`, `%d`, so each two-letter placeholder is consumed before its one-letter form.
* `%m` and `%d` are `parseInt()` of the padded part, which is why a locale with non-Latin digits turns them into `NaN`.
* With no **Timezone** picked, `timeZone` is `undefined` and `Intl` uses the host's timezone. The official containers run in UTC.
* Locale resolution: the counter's override, else the server's, and `en-US` when the tag is shorter than 2 characters.
* An invalid timezone identifier or locale tag makes `Intl.DateTimeFormat` throw a `RangeError`. It is not a `KnownError`, so the dashboard falls back to **An unknown error occurred.**
* Each top-level counter in a template has a 60 second timeout (`EVALUATION_TIMEOUT`), covering its nested counters too. The result is cut to 99 characters for voice and category names, 1023 for text and announcement topics, and a name under 2 characters throws `EVALUATION_RESULT_FOR_CHANNEL_NAME_IS_LESS_THAN_2_CHARACTERS`.
* On a failed evaluation the channel update job writes `jobs.updateChannels.computeError` (**ERROR!**) into the channel and stores the message as the channel's `LastTemplateComputeError`.
* The `Update channels` job runs on cron `0 */5 * * * *` when `DISCORD_BOT_INSTANCE_IS_PREMIUM` is `true`, and on `0 */10 * * * *` when it is `false`. The shipped `.env.example` sets it to `true`. No other environment variable affects Date.
* The timezone list is `apps/frontend/src/lib/timezones.ts` (109 entries), shared with Clock; the combobox only accepts entries from it.
* There is no **Live preview** when **Format** is empty or is filled by a nested counter; the whole template has to be previewed instead.

</details>
