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.

Date

ConstructorResolved pattern (en_GB)Output
DateFormat.yMd()d/M/y15/06/2025
DateFormat.yMMMd()d MMM y15 Jun 2025
DateFormat.yMMMMd()d MMMM y15 June 2025
DateFormat.yMMMMEEEEd()EEEE d MMMM ySunday 15 June 2025
DateFormat.Md()d/M15/06
DateFormat.MMMd()d MMM15 Jun
DateFormat.MMMMd()d MMMM15 June
DateFormat.yM()M/y06/2025
DateFormat.yMMM()MMM yJun 2025
DateFormat.yMMMM()MMMM yJune 2025
DateFormat.y()y2025
DateFormat.MMMM()MMMMJune
DateFormat.EEEE()EEEESunday

Time

ConstructorResolved pattern (en_GB)Output
DateFormat.jm()H:m17:05
DateFormat.jms()H:m:s17:05:09
DateFormat.Hm()HH:mm17:05
DateFormat.Hms()HH:mm:ss17:05:09
DateFormat.ms()mm:ss05:09

Date + time

ConstructorResolved pattern (en_GB)Output
DateFormat.yMd().add_jm()()d/M/y, H:m15/06/2025, 17:05
DateFormat.yMMMd().add_jm()()d MMM y, H:m15 Jun 2025, 17:05
DateFormat.yMMMMEEEEd().add_jms()()EEEE d MMMM y' at 'H:m:sSunday 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.

Sunday, 15 June 2025
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?”.

LocaleyMdPatternyMMMdjm
English (United States) en_US6/15/2025M/d/yJun 15, 20255:05 PM
English (United Kingdom) en_GB15/06/2025d/M/y15 Jun 202517:05
English (Australia) en_AU15/06/2025d/M/y15 June 20255:05 pm
French (France) fr_FR15/06/2025d/M/y15 juin 202517:05
German (Germany) de_DE15.6.2025d.M.y15. Juni 202517:05
Spanish (Spain) es_ES15/6/2025d/M/y15 jun 202517:05
Japanese (Japan) ja_JP2025/6/15y/M/d2025年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.

Start Free →

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 2025

Skeletons 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 PM

Don'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.

Related Flutter localization tools