`uuuu` versus `yyyy` in `DateTimeFormatter` formatting pattern codes in Java?

Within the scope of java.time-package, we can say:

  • It is safer to use “u” instead of “y” because DateTimeFormatter will otherwise insist on having an era in combination with “y” (= year-of-era). So using “u” would avoid some possible unexpected exceptions in strict formatting/parsing. See also this SO-post. Another minor thing which is improved by “u”-symbol compared with “y” is printing/parsing negative gregorian years (in far past).

  • Otherwise we can clearly state that using “u” instead of “y” breaks long-standing habits in Java-programming. It is also not intuitively clear that “u” denotes any kind of year because a) the first letter of the English word “year” is not in agreement with this symbol and b) SimpleDateFormat has used “u” for a different purpose since Java-7 (ISO-day-number-of-week). Confusion is guaranteed – for ever?

  • We should also see that using eras (symbol “G”) in context of ISO is in general dangerous if we consider historic dates. If “G” is used with “u” then both fields are unrelated to each other. And if “G” is used with “y” then the formatter is satisfied but still uses proleptic gregorian calendar when the historic date mandates different calendars and date-handling.

Background information:

When developing and integrating the JSR 310 (java.time-packages) the designers decided to use Common Locale Data Repository (CLDR)/LDML-spec as the base of pattern symbols in DateTimeFormatter. The symbol “u” was already defined in CLDR as proleptic gregorian year, so this meaning was adopted to new upcoming JSR-310 (but not to SimpleDateFormat because of backwards compatibility reasons).

However, this decision to follow CLDR was not quite consistent because JSR-310 had also introduced new pattern symbols which didn’t and still don’t exist in CLDR, see also this old CLDR-ticket. The suggested symbol “I” was changed by CLDR to “VV” and finally overtaken by JSR-310, including new symbols “x” and “X”. But “n” and “N” still don’t exist in CLDR, and since this old ticket is closed, it is not clear at all if CLDR will ever support it in the sense of JSR-310. Furthermore, the ticket does not mention the symbol “p” (padding instruction in JSR-310, but not defined in CLDR). So we have still no perfect agreement between pattern definitions across different libraries and languages.

And about “y”: We should also not overlook the fact that CLDR associates this year-of-era with at least some kind of mixed Julian/Gregorian year and not with the proleptic gregorian year as JSR-310 does (leaving the oddity of negative years aside). So no perfect agreement between CLDR and JSR-310 here, too.

Leave a Comment