Flutter intl DateFormat Playground
See exactly what Dart's DateFormat outputs for any locale — the classic en_USM/d/y vs en_GBd/M/y question, every skeleton, and any custom pattern. Formatting uses the same CLDR data the intl package is generated from.
DateFormat.yMd('en_GB').format(date)d/M/yDate
| Constructor | Resolved pattern (en_GB) | Output | |
|---|---|---|---|
DateFormat.yMd() | d/M/y | 15/06/2025 | |
DateFormat.yMMMd() | d MMM y | 15 Jun 2025 | |
DateFormat.yMMMMd() | d MMMM y | 15 June 2025 | |
DateFormat.yMMMMEEEEd() | EEEE d MMMM y | Sunday 15 June 2025 | |
DateFormat.Md() | d/M | 15/06 | |
DateFormat.MMMd() | d MMM | 15 Jun | |
DateFormat.MMMMd() | d MMMM | 15 June | |
DateFormat.yM() | M/y | 06/2025 | |
DateFormat.yMMM() | MMM y | Jun 2025 | |
DateFormat.yMMMM() | MMMM y | June 2025 | |
DateFormat.y() | y | 2025 | |
DateFormat.MMMM() | MMMM | June | |
DateFormat.EEEE() | EEEE | Sunday |
Time
| Constructor | Resolved pattern (en_GB) | Output | |
|---|---|---|---|
DateFormat.jm() | H:m | 17:05 | |
DateFormat.jms() | H:m:s | 17:05:09 | |
DateFormat.Hm() | HH:mm | 17:05 | |
DateFormat.Hms() | HH:mm:ss | 17:05:09 | |
DateFormat.ms() | mm:ss | 05:09 |
Date + time
| Constructor | Resolved pattern (en_GB) | Output | |
|---|---|---|---|
DateFormat.yMd().add_jm()() | d/M/y, H:m | 15/06/2025, 17:05 | |
DateFormat.yMMMd().add_jm()() | d MMM y, H:m | 15 Jun 2025, 17:05 | |
DateFormat.yMMMMEEEEd().add_jms()() | EEEE d MMMM y' at 'H:m:s | Sunday 15 June 2025 at 17:05:09 |
Custom pattern
Type any ICU/intl pattern — e.g. dd/MM/yyyy, EEEE, d MMMM y, h:mm a, yyyy-MM-dd HH:mm:ss. Names and AM/PM come from the selected locale.
DateFormat("EEEE, d MMMM y", 'en_GB').format(date)Same date across locales
How the sample date renders for popular locales — the fastest way to settle “which locale gives d/M/y?”.
| Locale | yMd | Pattern | yMMMd | jm |
|---|---|---|---|---|
English (United States) en_US | 6/15/2025 | M/d/y | Jun 15, 2025 | 5:05 PM |
English (United Kingdom) en_GB | 15/06/2025 | d/M/y | 15 Jun 2025 | 17:05 |
English (Australia) en_AU | 15/06/2025 | d/M/y | 15 June 2025 | 5:05 pm |
French (France) fr_FR | 15/06/2025 | d/M/y | 15 juin 2025 | 17:05 |
German (Germany) de_DE | 15.6.2025 | d.M.y | 15. Juni 2025 | 17:05 |
Spanish (Spain) es_ES | 15/6/2025 | d/M/y | 15 jun 2025 | 17:05 |
Japanese (Japan) ja_JP | 2025/6/15 | y/M/d | 2025年6月15日 | 17:05 |
Arabic (Egypt) ar_EG | ١٥/٦/٢٠٢٥ | d/M/y | ١٥ يونيو ٢٠٢٥ | ٥:٠٥ م |
Formatting dates is the easy part — translating your app is the hard part
FlutterLocalisation auto-fills missing translations with AI, keeps every locale in sync across your team, and ships updates over-the-air — no rebuild required.
How DateFormat picks a date order per locale
Dart's intl package formats dates through DateFormat. When you use a named constructor like DateFormat.yMd(), you are choosing a skeleton — the set of fields you want (year, month, day) — not a fixed order. intl then looks up the concrete pattern for the locale you pass and formats accordingly:
import 'package:intl/intl.dart';
DateFormat.yMd('en_US').format(date); // 6/15/2025 → pattern M/d/y
DateFormat.yMd('en_GB').format(date); // 15/06/2025 → pattern d/M/y
DateFormat.yMMMMEEEEd('fr_FR').format(date); // dimanche 15 juin 2025Skeletons vs. explicit patterns
If you need the same order everywhere regardless of locale, pass an explicit pattern string instead of a skeleton. The month/day names are still localized, but the field order is fixed:
DateFormat('dd/MM/yyyy').format(date); // 15/06/2025 everywhere
DateFormat('EEEE, d MMMM y', 'de_DE').format(date); // Sonntag, 15 Juni 2025
DateFormat('h:mm a', 'en_US').format(date); // 5:05 PMDon't forget the locale data
Non-en_US locales need their date symbols initialized before you format, or you'll hit a LocaleDataException. Call initializeDateFormatting() once at startup:
import 'package:intl/date_symbol_data_local.dart';
await initializeDateFormatting('fr_FR', null);
DateFormat.yMMMMd('fr_FR').format(date);Frequently asked questions
What does DateFormat.yMd() output for en_US vs en_GB?
DateFormat.yMd('en_US') formats the date as M/d/y — e.g. 6/15/2025 — while DateFormat.yMd('en_GB') uses d/M/y, giving 15/06/2025. The skeleton is the same; intl picks the field order from each locale's CLDR data. Change the locale dropdown on this page to see the exact output for any locale.
Why does my DateFormat show the wrong date order?
Named constructors like DateFormat.yMd() are locale-aware: the order of day, month and year comes from the locale you pass, not from the skeleton. If you want a fixed order regardless of locale, use an explicit pattern string such as DateFormat('dd/MM/yyyy'). Test both in the custom pattern box above.
What is the difference between a skeleton and a pattern in intl?
A skeleton (yMd, jm, MMMMEEEEd) describes which fields you want; intl resolves it to a concrete pattern using the locale's CLDR data, so the same skeleton produces different orders per locale. A pattern ('dd/MM/yyyy', 'h:mm a') is literal and identical across locales apart from translated names. This tool shows the resolved pattern for every skeleton so you can see what intl generates.
Does DateFormat.jm() use 12-hour or 24-hour time?
DateFormat.jm() uses the locale's preferred hour cycle: en_US gives 5:05 PM, while fr_FR or de_DE give 17:05. Use DateFormat.Hm() to force 24-hour (HH:mm) or DateFormat.jm() with an explicit 'h:mm a' pattern to force 12-hour, regardless of locale.
How accurate is this DateFormat playground?
Formatting uses the same CLDR locale data that Dart's intl package is generated from (via the browser's Intl engine), so field order, separators, month/day names and AM/PM markers match intl output for real locales. For unusual custom patterns always confirm against a quick DateFormat test in your app.