< prev index next >

src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java

Print this page
rev 47733 : 8176841: Additional Unicode Language-Tag Extensions
8189134: New system properties for the default Locale extensions
Reviewed-by:

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -118,10 +118,11 @@
 import java.util.TimeZone;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import sun.text.spi.JavaTimeDateTimePatternProvider;
+import sun.util.locale.provider.CalendarDataUtility;
 import sun.util.locale.provider.LocaleProviderAdapter;
 import sun.util.locale.provider.LocaleResources;
 import sun.util.locale.provider.TimeZoneNameUtility;
 
 /**

@@ -214,11 +215,12 @@
             throw new IllegalArgumentException("Either dateStyle or timeStyle must be non-null");
         }
         LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(JavaTimeDateTimePatternProvider.class, locale);
         JavaTimeDateTimePatternProvider provider = adapter.getJavaTimeDateTimePatternProvider();
         String pattern = provider.getJavaTimeDateTimePattern(convertStyle(timeStyle),
-                         convertStyle(dateStyle), chrono.getCalendarType(), locale);
+                         convertStyle(dateStyle), chrono.getCalendarType(),
+                         CalendarDataUtility.findRegionOverride(locale).orElse(locale));
         return pattern;
     }
 
     /**
      * Converts the given FormatStyle to the java.text.DateFormat style.

@@ -2158,10 +2160,16 @@
      * using the default locale.
      * <p>
      * This will create a formatter with the {@linkplain Locale#getDefault(Locale.Category) default FORMAT locale}.
      * Numbers will be printed and parsed using the standard DecimalStyle.
      * The resolver style will be {@link ResolverStyle#SMART SMART}.
+     * If the default locale contains "ca" (calendar), "rg" (region override)
+     * and/or "tz" (timezone)
+     * <a href="../../util/Locale.html#def_locale_extension">Unicode extensions</a>,
+     * the chronology and/or the zone are overriden. If both "ca" and "rg" are
+     * specified, the chronology from "ca" extension supersedes the implicit one
+     * from "rg" extension.
      * <p>
      * Calling this method will end any open optional sections by repeatedly
      * calling {@link #optionalEnd()} before creating the formatter.
      * <p>
      * This builder can still be used after creating the formatter if desired,

@@ -2178,10 +2186,16 @@
      * using the specified locale.
      * <p>
      * This will create a formatter with the specified locale.
      * Numbers will be printed and parsed using the standard DecimalStyle.
      * The resolver style will be {@link ResolverStyle#SMART SMART}.
+     * If the specified locale contains "ca" (calendar), "rg" (region override)
+     * and/or "tz" (timezone)
+     * <a href="../../util/Locale.html#def_locale_extension">Unicode extensions</a>,
+     * the chronology and/or the zone are overriden. If both "ca" and "rg" are
+     * specified, the chronology from "ca" extension supersedes the implicit one
+     * from "rg" extension.
      * <p>
      * Calling this method will end any open optional sections by repeatedly
      * calling {@link #optionalEnd()} before creating the formatter.
      * <p>
      * This builder can still be used after creating the formatter if desired,

@@ -2216,12 +2230,22 @@
         Objects.requireNonNull(locale, "locale");
         while (active.parent != null) {
             optionalEnd();
         }
         CompositePrinterParser pp = new CompositePrinterParser(printerParsers, false);
+
+        // Check for chronology/timezone in locale object
+        Chronology c = locale.getUnicodeLocaleType("ca") != null ?
+                       Chronology.ofLocale(locale) : chrono;
+        String tzType = locale.getUnicodeLocaleType("tz");
+        ZoneId z  = tzType != null ?
+                    TimeZoneNameUtility.convertLDMLShortID(tzType)
+                        .map(ZoneId::of)
+                        .orElse(null) :
+                    null;
         return new DateTimeFormatter(pp, locale, DecimalStyle.STANDARD,
-                resolverStyle, null, chrono, null);
+                resolverStyle, null, c, z);
     }
 
     //-----------------------------------------------------------------------
     /**
      * Strategy for formatting/parsing date-time information.
< prev index next >