Loading core/java/android/text/format/DateFormat.java +26 −6 Original line number Diff line number Diff line Loading @@ -24,12 +24,12 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.icu.text.DateFormatSymbols; import android.icu.text.DateTimePatternGenerator; import android.icu.util.ULocale; import android.os.Build; import android.provider.Settings; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.SpannedString; import android.text.TextUtils; import java.text.SimpleDateFormat; import java.util.Calendar; Loading Loading @@ -265,11 +265,13 @@ public class DateFormat { * @return a string pattern suitable for use with {@link java.text.SimpleDateFormat}. */ public static String getBestDateTimePattern(Locale locale, String skeleton) { DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(locale); ULocale uLocale = ULocale.forLocale(locale); DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(uLocale); boolean allowDuplicateFields = !CompatChanges.isChangeEnabled( DISALLOW_DUPLICATE_FIELD_IN_SKELETON); return dtpg.getBestPattern(skeleton, DateTimePatternGenerator.MATCH_NO_OPTIONS, String pattern = dtpg.getBestPattern(skeleton, DateTimePatternGenerator.MATCH_NO_OPTIONS, allowDuplicateFields); return getCompatibleEnglishPattern(uLocale, pattern); } /** Loading Loading @@ -303,10 +305,11 @@ public class DateFormat { */ @UnsupportedAppUsage public static String getTimeFormatString(Context context, int userHandle) { DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance( context.getResources().getConfiguration().locale); return is24HourFormat(context, userHandle) ? dtpg.getBestPattern("Hm") ULocale uLocale = ULocale.forLocale(context.getResources().getConfiguration().locale); DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(uLocale); String pattern = is24HourFormat(context, userHandle) ? dtpg.getBestPattern("Hm") : dtpg.getBestPattern("hm"); return getCompatibleEnglishPattern(uLocale, pattern); } /** Loading Loading @@ -713,4 +716,21 @@ public class DateFormat { public static DateFormatSymbols getIcuDateFormatSymbols(Locale locale) { return new DateFormatSymbols(android.icu.util.GregorianCalendar.class, locale); } /** * See http://b/266731719. It mirrors the implementation in * {@link libcore.icu.SimpleDateFormatData.DateTimeFormatStringGenerator#postProcessPattern} */ private static String getCompatibleEnglishPattern(ULocale locale, String pattern) { if (pattern == null || locale == null || !"en".equals(locale.getLanguage())) { return pattern; } String region = locale.getCountry(); if (region != null && !region.isEmpty() && !"US".equals(region)) { return pattern; } return pattern.replace('\u202f', ' '); } } core/tests/coretests/src/android/text/format/DateFormatTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -156,8 +156,8 @@ public class DateFormatTest { @DisableCompatChanges({DateFormat.DISALLOW_DUPLICATE_FIELD_IN_SKELETON}) public void testGetBestDateTimePattern_enableDuplicateField() { // en-US uses 12-hour format by default. assertEquals("h:mm\u202fa", DateFormat.getBestDateTimePattern(Locale.US, "jmma")); assertEquals("h:mm\u202fa", DateFormat.getBestDateTimePattern(Locale.US, "ahmma")); assertEquals("h:mm a", DateFormat.getBestDateTimePattern(Locale.US, "jmma")); assertEquals("h:mm a", DateFormat.getBestDateTimePattern(Locale.US, "ahmma")); } private static void assertIllegalArgumentException(Locale l, String skeleton) { Loading core/tests/coretests/src/android/text/format/DateUtilsTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -139,16 +139,16 @@ public class DateUtilsTest { fixedTime, java.text.DateFormat.SHORT, java.text.DateFormat.FULL)); final long hourDuration = 2 * 60 * 60 * 1000; assertEquals("5:30:15\u202fAM Greenwich Mean Time", DateUtils.formatSameDayTime( assertEquals("5:30:15 AM Greenwich Mean Time", DateUtils.formatSameDayTime( fixedTime + hourDuration, fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.FULL)); assertEquals("5:30:15\u202fAM", DateUtils.formatSameDayTime(fixedTime + hourDuration, assertEquals("5:30:15 AM", DateUtils.formatSameDayTime(fixedTime + hourDuration, fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.DEFAULT)); assertEquals("5:30:15\u202fAM GMT", DateUtils.formatSameDayTime(fixedTime + hourDuration, assertEquals("5:30:15 AM GMT", DateUtils.formatSameDayTime(fixedTime + hourDuration, fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.LONG)); assertEquals("5:30:15\u202fAM", DateUtils.formatSameDayTime(fixedTime + hourDuration, assertEquals("5:30:15 AM", DateUtils.formatSameDayTime(fixedTime + hourDuration, fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.MEDIUM)); assertEquals("5:30\u202fAM", DateUtils.formatSameDayTime(fixedTime + hourDuration, assertEquals("5:30 AM", DateUtils.formatSameDayTime(fixedTime + hourDuration, fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.SHORT)); } Loading Loading
core/java/android/text/format/DateFormat.java +26 −6 Original line number Diff line number Diff line Loading @@ -24,12 +24,12 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.icu.text.DateFormatSymbols; import android.icu.text.DateTimePatternGenerator; import android.icu.util.ULocale; import android.os.Build; import android.provider.Settings; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.SpannedString; import android.text.TextUtils; import java.text.SimpleDateFormat; import java.util.Calendar; Loading Loading @@ -265,11 +265,13 @@ public class DateFormat { * @return a string pattern suitable for use with {@link java.text.SimpleDateFormat}. */ public static String getBestDateTimePattern(Locale locale, String skeleton) { DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(locale); ULocale uLocale = ULocale.forLocale(locale); DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(uLocale); boolean allowDuplicateFields = !CompatChanges.isChangeEnabled( DISALLOW_DUPLICATE_FIELD_IN_SKELETON); return dtpg.getBestPattern(skeleton, DateTimePatternGenerator.MATCH_NO_OPTIONS, String pattern = dtpg.getBestPattern(skeleton, DateTimePatternGenerator.MATCH_NO_OPTIONS, allowDuplicateFields); return getCompatibleEnglishPattern(uLocale, pattern); } /** Loading Loading @@ -303,10 +305,11 @@ public class DateFormat { */ @UnsupportedAppUsage public static String getTimeFormatString(Context context, int userHandle) { DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance( context.getResources().getConfiguration().locale); return is24HourFormat(context, userHandle) ? dtpg.getBestPattern("Hm") ULocale uLocale = ULocale.forLocale(context.getResources().getConfiguration().locale); DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(uLocale); String pattern = is24HourFormat(context, userHandle) ? dtpg.getBestPattern("Hm") : dtpg.getBestPattern("hm"); return getCompatibleEnglishPattern(uLocale, pattern); } /** Loading Loading @@ -713,4 +716,21 @@ public class DateFormat { public static DateFormatSymbols getIcuDateFormatSymbols(Locale locale) { return new DateFormatSymbols(android.icu.util.GregorianCalendar.class, locale); } /** * See http://b/266731719. It mirrors the implementation in * {@link libcore.icu.SimpleDateFormatData.DateTimeFormatStringGenerator#postProcessPattern} */ private static String getCompatibleEnglishPattern(ULocale locale, String pattern) { if (pattern == null || locale == null || !"en".equals(locale.getLanguage())) { return pattern; } String region = locale.getCountry(); if (region != null && !region.isEmpty() && !"US".equals(region)) { return pattern; } return pattern.replace('\u202f', ' '); } }
core/tests/coretests/src/android/text/format/DateFormatTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -156,8 +156,8 @@ public class DateFormatTest { @DisableCompatChanges({DateFormat.DISALLOW_DUPLICATE_FIELD_IN_SKELETON}) public void testGetBestDateTimePattern_enableDuplicateField() { // en-US uses 12-hour format by default. assertEquals("h:mm\u202fa", DateFormat.getBestDateTimePattern(Locale.US, "jmma")); assertEquals("h:mm\u202fa", DateFormat.getBestDateTimePattern(Locale.US, "ahmma")); assertEquals("h:mm a", DateFormat.getBestDateTimePattern(Locale.US, "jmma")); assertEquals("h:mm a", DateFormat.getBestDateTimePattern(Locale.US, "ahmma")); } private static void assertIllegalArgumentException(Locale l, String skeleton) { Loading
core/tests/coretests/src/android/text/format/DateUtilsTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -139,16 +139,16 @@ public class DateUtilsTest { fixedTime, java.text.DateFormat.SHORT, java.text.DateFormat.FULL)); final long hourDuration = 2 * 60 * 60 * 1000; assertEquals("5:30:15\u202fAM Greenwich Mean Time", DateUtils.formatSameDayTime( assertEquals("5:30:15 AM Greenwich Mean Time", DateUtils.formatSameDayTime( fixedTime + hourDuration, fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.FULL)); assertEquals("5:30:15\u202fAM", DateUtils.formatSameDayTime(fixedTime + hourDuration, assertEquals("5:30:15 AM", DateUtils.formatSameDayTime(fixedTime + hourDuration, fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.DEFAULT)); assertEquals("5:30:15\u202fAM GMT", DateUtils.formatSameDayTime(fixedTime + hourDuration, assertEquals("5:30:15 AM GMT", DateUtils.formatSameDayTime(fixedTime + hourDuration, fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.LONG)); assertEquals("5:30:15\u202fAM", DateUtils.formatSameDayTime(fixedTime + hourDuration, assertEquals("5:30:15 AM", DateUtils.formatSameDayTime(fixedTime + hourDuration, fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.MEDIUM)); assertEquals("5:30\u202fAM", DateUtils.formatSameDayTime(fixedTime + hourDuration, assertEquals("5:30 AM", DateUtils.formatSameDayTime(fixedTime + hourDuration, fixedTime, java.text.DateFormat.FULL, java.text.DateFormat.SHORT)); } Loading