am 3d5be42e
: Merge changes I87c2ab9e,I2dafcc34,I731c96c2 into jb-mr1-dev
* commit '3d5be42eaa35914d9b37fe052fa7222dc1992dc0': Fix formatDateRange month names for Farsi. Use localized digits for Time formatting. Use proper digits in formatElapsedTime and format3339
This commit is contained in:
@ -45,7 +45,6 @@ public class DateUtils
|
||||
|
||||
private static final String FAST_FORMAT_HMMSS = "%1$d:%2$02d:%3$02d";
|
||||
private static final String FAST_FORMAT_MMSS = "%1$02d:%2$02d";
|
||||
private static final char TIME_PADDING = '0';
|
||||
private static final char TIME_SEPARATOR = ':';
|
||||
|
||||
|
||||
@ -648,33 +647,36 @@ public class DateUtils
|
||||
}
|
||||
}
|
||||
|
||||
private static void append(StringBuilder sb, long value, boolean pad, char zeroDigit) {
|
||||
if (value < 10) {
|
||||
if (pad) {
|
||||
sb.append(zeroDigit);
|
||||
}
|
||||
} else {
|
||||
sb.append((char) (zeroDigit + (value / 10)));
|
||||
}
|
||||
sb.append((char) (zeroDigit + (value % 10)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Fast formatting of h:mm:ss
|
||||
* Fast formatting of h:mm:ss.
|
||||
*/
|
||||
private static String formatElapsedTime(StringBuilder recycle, String format, long hours,
|
||||
long minutes, long seconds) {
|
||||
if (FAST_FORMAT_HMMSS.equals(format)) {
|
||||
char zeroDigit = LocaleData.get(Locale.getDefault()).zeroDigit;
|
||||
|
||||
StringBuilder sb = recycle;
|
||||
if (sb == null) {
|
||||
sb = new StringBuilder(8);
|
||||
} else {
|
||||
sb.setLength(0);
|
||||
}
|
||||
sb.append(hours);
|
||||
append(sb, hours, false, zeroDigit);
|
||||
sb.append(TIME_SEPARATOR);
|
||||
if (minutes < 10) {
|
||||
sb.append(TIME_PADDING);
|
||||
} else {
|
||||
sb.append(toDigitChar(minutes / 10));
|
||||
}
|
||||
sb.append(toDigitChar(minutes % 10));
|
||||
append(sb, minutes, true, zeroDigit);
|
||||
sb.append(TIME_SEPARATOR);
|
||||
if (seconds < 10) {
|
||||
sb.append(TIME_PADDING);
|
||||
} else {
|
||||
sb.append(toDigitChar(seconds / 10));
|
||||
}
|
||||
sb.append(toDigitChar(seconds % 10));
|
||||
append(sb, seconds, true, zeroDigit);
|
||||
return sb.toString();
|
||||
} else {
|
||||
return String.format(format, hours, minutes, seconds);
|
||||
@ -682,40 +684,28 @@ public class DateUtils
|
||||
}
|
||||
|
||||
/**
|
||||
* Fast formatting of m:ss
|
||||
* Fast formatting of mm:ss.
|
||||
*/
|
||||
private static String formatElapsedTime(StringBuilder recycle, String format, long minutes,
|
||||
long seconds) {
|
||||
if (FAST_FORMAT_MMSS.equals(format)) {
|
||||
char zeroDigit = LocaleData.get(Locale.getDefault()).zeroDigit;
|
||||
|
||||
StringBuilder sb = recycle;
|
||||
if (sb == null) {
|
||||
sb = new StringBuilder(8);
|
||||
} else {
|
||||
sb.setLength(0);
|
||||
}
|
||||
if (minutes < 10) {
|
||||
sb.append(TIME_PADDING);
|
||||
} else {
|
||||
sb.append(toDigitChar(minutes / 10));
|
||||
}
|
||||
sb.append(toDigitChar(minutes % 10));
|
||||
append(sb, minutes, false, zeroDigit);
|
||||
sb.append(TIME_SEPARATOR);
|
||||
if (seconds < 10) {
|
||||
sb.append(TIME_PADDING);
|
||||
} else {
|
||||
sb.append(toDigitChar(seconds / 10));
|
||||
}
|
||||
sb.append(toDigitChar(seconds % 10));
|
||||
append(sb, seconds, true, zeroDigit);
|
||||
return sb.toString();
|
||||
} else {
|
||||
return String.format(format, minutes, seconds);
|
||||
}
|
||||
}
|
||||
|
||||
private static char toDigitChar(long digit) {
|
||||
return (char) (digit + '0');
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a date / time such that if the then is on the same day as now, it shows
|
||||
* just the time and if it's a different day, it shows just the date.
|
||||
@ -1387,6 +1377,14 @@ public class DateUtils
|
||||
String endMonthDayString = isInstant ? null : endDate.format(MONTH_DAY_FORMAT);
|
||||
String endYearString = isInstant ? null : endDate.format(YEAR_FORMAT);
|
||||
|
||||
String startStandaloneMonthString = startMonthString;
|
||||
String endStandaloneMonthString = endMonthString;
|
||||
// We need standalone months for these strings in Persian (fa): http://b/6811327
|
||||
if (!numericDate && !abbrevMonth && Locale.getDefault().getLanguage().equals("fa")) {
|
||||
startStandaloneMonthString = startDate.format("%-B");
|
||||
endStandaloneMonthString = endDate.format("%-B");
|
||||
}
|
||||
|
||||
if (startMonthNum != endMonthNum) {
|
||||
// Same year, different month.
|
||||
// Example: "October 28 - November 3"
|
||||
@ -1407,7 +1405,8 @@ public class DateUtils
|
||||
startWeekDayString, startMonthString, startMonthDayString,
|
||||
startYearString, startTimeString,
|
||||
endWeekDayString, endMonthString, endMonthDayString,
|
||||
endYearString, endTimeString);
|
||||
endYearString, endTimeString,
|
||||
startStandaloneMonthString, endStandaloneMonthString);
|
||||
}
|
||||
|
||||
if (startDay != endDay) {
|
||||
@ -1426,7 +1425,8 @@ public class DateUtils
|
||||
startWeekDayString, startMonthString, startMonthDayString,
|
||||
startYearString, startTimeString,
|
||||
endWeekDayString, endMonthString, endMonthDayString,
|
||||
endYearString, endTimeString);
|
||||
endYearString, endTimeString,
|
||||
startStandaloneMonthString, endStandaloneMonthString);
|
||||
}
|
||||
|
||||
// Same start and end day
|
||||
|
@ -151,6 +151,9 @@ public class Time {
|
||||
private static String sDateTimeFormat;
|
||||
private static String sAm;
|
||||
private static String sPm;
|
||||
private static char sZeroDigit;
|
||||
|
||||
// Referenced by native code.
|
||||
private static String sDateCommand = "%a %b %e %H:%M:%S %Z %Y";
|
||||
|
||||
/**
|
||||
@ -323,6 +326,7 @@ public class Time {
|
||||
|
||||
sAm = localeData.amPm[0];
|
||||
sPm = localeData.amPm[1];
|
||||
sZeroDigit = localeData.zeroDigit;
|
||||
|
||||
sShortMonths = localeData.shortMonthNames;
|
||||
sLongMonths = localeData.longMonthNames;
|
||||
@ -338,12 +342,32 @@ public class Time {
|
||||
sLocale = locale;
|
||||
}
|
||||
|
||||
return format1(format);
|
||||
String result = format1(format);
|
||||
if (sZeroDigit != '0') {
|
||||
result = localizeDigits(result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
native private String format1(String format);
|
||||
|
||||
// TODO: unify this with java.util.Formatter's copy.
|
||||
private String localizeDigits(String s) {
|
||||
int length = s.length();
|
||||
int offsetToLocalizedDigits = sZeroDigit - '0';
|
||||
StringBuilder result = new StringBuilder(length);
|
||||
for (int i = 0; i < length; ++i) {
|
||||
char ch = s.charAt(i);
|
||||
if (ch >= '0' && ch <= '9') {
|
||||
ch += offsetToLocalizedDigits;
|
||||
}
|
||||
result.append(ch);
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the current time in YYYYMMDDTHHMMSS<tz> format
|
||||
*/
|
||||
@ -673,7 +697,7 @@ public class Time {
|
||||
int minutes = (offset % 3600) / 60;
|
||||
int hours = offset / 3600;
|
||||
|
||||
return String.format("%s%s%02d:%02d", base, sign, hours, minutes);
|
||||
return String.format(Locale.US, "%s%s%02d:%02d", base, sign, hours, minutes);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -37,22 +37,22 @@
|
||||
<string name="time_wday_date">%1$s، %2$s %3$s</string>
|
||||
<string name="wday_date">%2$s %3$s</string>
|
||||
<string name="time_wday">%1$s، %2$s</string>
|
||||
<string name="same_year_md1_md2">%3$s LLLL تا %8$s LLLL</string>
|
||||
<string name="same_year_wday1_md1_wday2_md2">%1$s %3$s LLLL تا %6$s %8$s LLLL</string>
|
||||
<string name="same_year_md1_time1_md2_time2">%5$s، %3$s LLLL تا %10$s، %8$s LLLL</string>
|
||||
<string name="same_month_md1_time1_md2_time2">%5$s، %3$s LLLL تا %10$s، %8$s LLLL</string>
|
||||
<string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s، %1$s %3$s LLLL تا %10$s، %6$s %8$s LLLL</string>
|
||||
<string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s، %1$s %3$s LLLL تا %10$s، %6$s %8$s LLLL</string>
|
||||
<string name="same_year_md1_md2">%3$s %11$s تا %8$s %12$s</string>
|
||||
<string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %11$s تا %6$s %8$s %12$s</string>
|
||||
<string name="same_year_md1_time1_md2_time2">%5$s، %3$s %11$s تا %10$s، %8$s %12$s</string>
|
||||
<string name="same_month_md1_time1_md2_time2">%5$s، %3$s %11$s تا %10$s، %8$s %12$s</string>
|
||||
<string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s، %1$s %3$s %11$s تا %10$s، %6$s %8$s %12$s</string>
|
||||
<string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s، %1$s %3$s %11$s تا %10$s، %6$s %8$s %12$s</string>
|
||||
<string name="same_year_mdy1_time1_mdy2_time2">%5$s، %3$s %2$s %4$s تا %10$s، %8$s %7$s %9$s</string>
|
||||
<string name="same_month_mdy1_time1_mdy2_time2">%5$s، %3$s %2$s %4$s تا %10$s، %8$s %7$s %9$s</string>
|
||||
<string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s، %1$s %3$s %2$s %4$s تا %10$s، %6$s %8$s %7$s %9$s</string>
|
||||
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s، %1$s %3$s %2$s %4$s تا %10$s، %6$s %8$s %7$s %9$s</string>
|
||||
<string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s %4$s تا %6$s %8$s %7$s %9$s</string>
|
||||
<string name="same_month_md1_md2">%3$s تا %8$s LLL</string>
|
||||
<string name="same_month_wday1_md1_wday2_md2">%1$s %3$s LLLL تا %6$s %8$s LLLL</string>
|
||||
<string name="same_year_mdy1_mdy2">%3$s LLL تا %8$s %2$s %9$s</string>
|
||||
<string name="same_month_md1_md2">%3$s تا %8$s %11$s</string>
|
||||
<string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %11$s تا %6$s %8$s %12$s</string>
|
||||
<string name="same_year_mdy1_mdy2">%3$s %11$s تا %8$s %7$s %9$s</string>
|
||||
<string name="same_month_mdy1_mdy2">%3$s تا %8$s %2$s %9$s</string>
|
||||
<string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s LLL تا %6$s %8$s %2$s %9$s</string>
|
||||
<string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %11$s تا %6$s %8$s %7$s %9$s</string>
|
||||
<string name="short_format_month">%b</string>
|
||||
<string name="full_wday_month_day_no_year">E d LLLL</string>
|
||||
<string name="abbrev_wday_month_day_no_year">E d LLLL</string>
|
||||
|
Reference in New Issue
Block a user