How do I format dates for different locales in EK9?

← Date, Time, and Duration · Ref: Q549

EK9's Locale type provides four named formatting levels that automatically adapt to regional conventions. No format pattern strings needed.

FOUR FORMATTING LEVELS FOR DATES

  - shortFormat: compact numeric (03/10/2020 GB, 10/3/20 US)
  - mediumFormat: abbreviated month (Oct 3, 2020 US, 3 Oct 2020 GB)
  - longFormat: full month name (3. Oktober 2020 DE)
  - fullFormat: includes day-of-week (Samstag, 3. Oktober 2020 DE)

Each locale adjusts automatically: date order (day/month vs month/day), separators, month names, and day names.

SAME METHODS FOR TIME AND DATETIME

The four formatting levels also work on Time and DateTime:

  locale.shortFormat(09:30:00) gives locale-appropriate time
  locale.longFormat(2024-06-15T10:30:00Z) gives full date+time+timezone

DAY OF WEEK

  locale.dayOfWeek(date) returns the localized day name:
  Locale('de_DE').dayOfWeek(2024-06-15) gives 'Samstag'
  Locale('en_GB').dayOfWeek(2024-06-15) gives 'Saturday'

WHY NO PATTERN STRINGS

Pattern strings like 'yyyy-MM-dd' or 'dd/MM/yyyy' are error-prone: 'mm' means minutes in Java but months in Excel. Named levels are unambiguous and locale-correct by default.

See Q44 for the complete Locale formatting guide. See Q537 for ISO 8601 formatting. See Q551 for RFC 7231 HTTP date headers.

Example

#!ek9
defines module qa.locale.date.formatting

  defines program
    LocaleDateFormattingDemo()
      stdout <- Stdout()

      wedding <- 2020-10-03
      lunchTime <- 12:00:01
      meeting <- 2024-06-15T10:30:00Z

      // Create locales
      enGB <- Locale("en_GB")
      enUS <- Locale("en_US")
      deutsch <- Locale("de_DE")
      francais <- Locale("fr_FR")

      // Date formatting - four levels
      stdout.println("=== Date Formatting ===")
      stdout.println(`GB short: ${enGB.shortFormat(wedding)}`)
      stdout.println(`US short: ${enUS.shortFormat(wedding)}`)
      stdout.println(`GB medium: ${enGB.mediumFormat(wedding)}`)
      stdout.println(`US medium: ${enUS.mediumFormat(wedding)}`)
      stdout.println(`DE long: ${deutsch.longFormat(wedding)}`)
      stdout.println(`FR long: ${francais.longFormat(wedding)}`)
      stdout.println(`GB full: ${enGB.fullFormat(wedding)}`)
      stdout.println(`DE full: ${deutsch.fullFormat(wedding)}`)

      // Time formatting
      stdout.println("=== Time Formatting ===")
      stdout.println(`GB short time: ${enGB.shortFormat(lunchTime)}`)
      stdout.println(`US short time: ${enUS.shortFormat(lunchTime)}`)
      stdout.println(`DE medium time: ${deutsch.mediumFormat(lunchTime)}`)

      // DateTime formatting
      stdout.println("=== DateTime Formatting ===")
      stdout.println(`US short DT: ${enUS.shortFormat(meeting)}`)
      stdout.println(`GB medium DT: ${enGB.mediumFormat(meeting)}`)
      stdout.println(`DE long DT: ${deutsch.longFormat(meeting)}`)
      stdout.println(`FR full DT: ${francais.fullFormat(meeting)}`)

      // Day of week
      stdout.println("=== Day of Week ===")
      stdout.println(`GB: ${enGB.dayOfWeek(wedding)}`)
      stdout.println(`DE: ${deutsch.dayOfWeek(wedding)}`)
      stdout.println(`FR: ${francais.dayOfWeek(wedding)}`)

Common mistakes

E50060 — Locale has no generic format() method. Use the four named methods: shortFormat(), mediumFormat(), longFormat(), fullFormat(). See ek9 -h E50060 for details.

Incorrect:

stdout.println(`GB short: ${enGB.format(wedding, "short")}`)

Correct:

stdout.println(`GB short: ${enGB.shortFormat(wedding)}`)
Other ways to ask this
  • How do I display dates in German or French format?
  • How do locale formatting levels work with dates?
  • How do I internationalize date display?

Coming from another language?

Java: DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(). Python: babel.dates.format_date(style='short', locale='de_DE'). JavaScript: Intl.DateTimeFormat with options. Go: no built-in locale formatting. Rust: no built-in, chrono-locale crate. EK9: Locale('de_DE').shortFormat(date) four named levels, no pattern strings.

Keywords: date, dayOfWeek, duration, format, fullFormat, i18n, internationalization, locale, longFormat, mediumFormat, migrate, regional, shortFormat, time, timezone