jdk/src/java.base/share/classes/java/util/Formatter.java
changeset 33675 7d9d372a41df
parent 32211 dc60c4df6b75
child 34781 479b1724ab80
equal deleted inserted replaced
33674:566777f73c32 33675:7d9d372a41df
    47 import java.text.DecimalFormat;
    47 import java.text.DecimalFormat;
    48 import java.text.DecimalFormatSymbols;
    48 import java.text.DecimalFormatSymbols;
    49 import java.text.NumberFormat;
    49 import java.text.NumberFormat;
    50 import java.util.regex.Matcher;
    50 import java.util.regex.Matcher;
    51 import java.util.regex.Pattern;
    51 import java.util.regex.Pattern;
       
    52 import java.util.Objects;
    52 
    53 
    53 import java.time.DateTimeException;
    54 import java.time.DateTimeException;
    54 import java.time.Instant;
    55 import java.time.Instant;
    55 import java.time.ZoneId;
    56 import java.time.ZoneId;
    56 import java.time.ZoneOffset;
    57 import java.time.ZoneOffset;
  3858                 if (l != null && l != Locale.US) {
  3859                 if (l != null && l != Locale.US) {
  3859                     DateFormatSymbols dfs = DateFormatSymbols.getInstance(l);
  3860                     DateFormatSymbols dfs = DateFormatSymbols.getInstance(l);
  3860                     ampm = dfs.getAmPmStrings();
  3861                     ampm = dfs.getAmPmStrings();
  3861                 }
  3862                 }
  3862                 String s = ampm[t.get(Calendar.AM_PM)];
  3863                 String s = ampm[t.get(Calendar.AM_PM)];
  3863                 sb.append(s.toLowerCase(l != null ? l : Locale.US));
  3864                 sb.append(s.toLowerCase(Objects.requireNonNullElse(l, Locale.US)));
  3864                 break;
  3865                 break;
  3865             }
  3866             }
  3866             case DateTime.SECONDS_SINCE_EPOCH: { // 's' (0 - 99...?)
  3867             case DateTime.SECONDS_SINCE_EPOCH: { // 's' (0 - 99...?)
  3867                 long i = t.getTimeInMillis() / 1000;
  3868                 long i = t.getTimeInMillis() / 1000;
  3868                 Flags flags = Flags.NONE;
  3869                 Flags flags = Flags.NONE;
  3891             }
  3892             }
  3892             case DateTime.ZONE:        { // 'Z' (symbol)
  3893             case DateTime.ZONE:        { // 'Z' (symbol)
  3893                 TimeZone tz = t.getTimeZone();
  3894                 TimeZone tz = t.getTimeZone();
  3894                 sb.append(tz.getDisplayName((t.get(Calendar.DST_OFFSET) != 0),
  3895                 sb.append(tz.getDisplayName((t.get(Calendar.DST_OFFSET) != 0),
  3895                                            TimeZone.SHORT,
  3896                                            TimeZone.SHORT,
  3896                                             (l == null) ? Locale.US : l));
  3897                                            Objects.requireNonNullElse(l, Locale.US)));
  3897                 break;
  3898                 break;
  3898             }
  3899             }
  3899 
  3900 
  3900             // Date
  3901             // Date
  3901             case DateTime.NAME_OF_DAY_ABBREV:     // 'a'
  3902             case DateTime.NAME_OF_DAY_ABBREV:     // 'a'
  3902             case DateTime.NAME_OF_DAY:          { // 'A'
  3903             case DateTime.NAME_OF_DAY:          { // 'A'
  3903                 int i = t.get(Calendar.DAY_OF_WEEK);
  3904                 int i = t.get(Calendar.DAY_OF_WEEK);
  3904                 Locale lt = ((l == null) ? Locale.US : l);
  3905                 Locale lt = Objects.requireNonNullElse(l, Locale.US);
  3905                 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt);
  3906                 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt);
  3906                 if (c == DateTime.NAME_OF_DAY)
  3907                 if (c == DateTime.NAME_OF_DAY)
  3907                     sb.append(dfs.getWeekdays()[i]);
  3908                     sb.append(dfs.getWeekdays()[i]);
  3908                 else
  3909                 else
  3909                     sb.append(dfs.getShortWeekdays()[i]);
  3910                     sb.append(dfs.getShortWeekdays()[i]);
  3911             }
  3912             }
  3912             case DateTime.NAME_OF_MONTH_ABBREV:   // 'b'
  3913             case DateTime.NAME_OF_MONTH_ABBREV:   // 'b'
  3913             case DateTime.NAME_OF_MONTH_ABBREV_X: // 'h' -- same b
  3914             case DateTime.NAME_OF_MONTH_ABBREV_X: // 'h' -- same b
  3914             case DateTime.NAME_OF_MONTH:        { // 'B'
  3915             case DateTime.NAME_OF_MONTH:        { // 'B'
  3915                 int i = t.get(Calendar.MONTH);
  3916                 int i = t.get(Calendar.MONTH);
  3916                 Locale lt = ((l == null) ? Locale.US : l);
  3917                 Locale lt = Objects.requireNonNullElse(l, Locale.US);
  3917                 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt);
  3918                 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt);
  3918                 if (c == DateTime.NAME_OF_MONTH)
  3919                 if (c == DateTime.NAME_OF_MONTH)
  3919                     sb.append(dfs.getMonths()[i]);
  3920                     sb.append(dfs.getMonths()[i]);
  3920                 else
  3921                 else
  3921                     sb.append(dfs.getShortMonths()[i]);
  3922                     sb.append(dfs.getShortMonths()[i]);
  3982                 print(sb, t, DateTime.SECOND, l).append(' ');
  3983                 print(sb, t, DateTime.SECOND, l).append(' ');
  3983                 // this may be in wrong place for some locales
  3984                 // this may be in wrong place for some locales
  3984                 StringBuilder tsb = new StringBuilder();
  3985                 StringBuilder tsb = new StringBuilder();
  3985                 print(tsb, t, DateTime.AM_PM, l);
  3986                 print(tsb, t, DateTime.AM_PM, l);
  3986 
  3987 
  3987                 sb.append(tsb.toString().toUpperCase(l != null ? l : Locale.US));
  3988                 sb.append(tsb.toString().toUpperCase(Objects.requireNonNullElse(l, Locale.US)));
  3988                 break;
  3989                 break;
  3989             }
  3990             }
  3990             case DateTime.DATE_TIME:    { // 'c' (Sat Nov 04 12:02:33 EST 1999)
  3991             case DateTime.DATE_TIME:    { // 'c' (Sat Nov 04 12:02:33 EST 1999)
  3991                 char sep = ' ';
  3992                 char sep = ' ';
  3992                 print(sb, t, DateTime.NAME_OF_DAY_ABBREV, l).append(sep);
  3993                 print(sb, t, DateTime.NAME_OF_DAY_ABBREV, l).append(sep);
  4090                     if (l != null && l != Locale.US) {
  4091                     if (l != null && l != Locale.US) {
  4091                         DateFormatSymbols dfs = DateFormatSymbols.getInstance(l);
  4092                         DateFormatSymbols dfs = DateFormatSymbols.getInstance(l);
  4092                         ampm = dfs.getAmPmStrings();
  4093                         ampm = dfs.getAmPmStrings();
  4093                     }
  4094                     }
  4094                     String s = ampm[t.get(ChronoField.AMPM_OF_DAY)];
  4095                     String s = ampm[t.get(ChronoField.AMPM_OF_DAY)];
  4095                     sb.append(s.toLowerCase(l != null ? l : Locale.US));
  4096                     sb.append(s.toLowerCase(Objects.requireNonNullElse(l, Locale.US)));
  4096                     break;
  4097                     break;
  4097                 }
  4098                 }
  4098                 case DateTime.SECONDS_SINCE_EPOCH: { // 's' (0 - 99...?)
  4099                 case DateTime.SECONDS_SINCE_EPOCH: { // 's' (0 - 99...?)
  4099                     long i = t.getLong(ChronoField.INSTANT_SECONDS);
  4100                     long i = t.getLong(ChronoField.INSTANT_SECONDS);
  4100                     Flags flags = Flags.NONE;
  4101                     Flags flags = Flags.NONE;
  4129                         t.isSupported(ChronoField.INSTANT_SECONDS)) {
  4130                         t.isSupported(ChronoField.INSTANT_SECONDS)) {
  4130                         Instant instant = Instant.from(t);
  4131                         Instant instant = Instant.from(t);
  4131                         sb.append(TimeZone.getTimeZone(zid.getId())
  4132                         sb.append(TimeZone.getTimeZone(zid.getId())
  4132                                           .getDisplayName(zid.getRules().isDaylightSavings(instant),
  4133                                           .getDisplayName(zid.getRules().isDaylightSavings(instant),
  4133                                                           TimeZone.SHORT,
  4134                                                           TimeZone.SHORT,
  4134                                                           (l == null) ? Locale.US : l));
  4135                                                           Objects.requireNonNullElse(l, Locale.US)));
  4135                         break;
  4136                         break;
  4136                     }
  4137                     }
  4137                     sb.append(zid.getId());
  4138                     sb.append(zid.getId());
  4138                     break;
  4139                     break;
  4139                 }
  4140                 }
  4140                 // Date
  4141                 // Date
  4141                 case DateTime.NAME_OF_DAY_ABBREV:     // 'a'
  4142                 case DateTime.NAME_OF_DAY_ABBREV:     // 'a'
  4142                 case DateTime.NAME_OF_DAY:          { // 'A'
  4143                 case DateTime.NAME_OF_DAY:          { // 'A'
  4143                     int i = t.get(ChronoField.DAY_OF_WEEK) % 7 + 1;
  4144                     int i = t.get(ChronoField.DAY_OF_WEEK) % 7 + 1;
  4144                     Locale lt = ((l == null) ? Locale.US : l);
  4145                     Locale lt = Objects.requireNonNullElse(l, Locale.US);
  4145                     DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt);
  4146                     DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt);
  4146                     if (c == DateTime.NAME_OF_DAY)
  4147                     if (c == DateTime.NAME_OF_DAY)
  4147                         sb.append(dfs.getWeekdays()[i]);
  4148                         sb.append(dfs.getWeekdays()[i]);
  4148                     else
  4149                     else
  4149                         sb.append(dfs.getShortWeekdays()[i]);
  4150                         sb.append(dfs.getShortWeekdays()[i]);
  4151                 }
  4152                 }
  4152                 case DateTime.NAME_OF_MONTH_ABBREV:   // 'b'
  4153                 case DateTime.NAME_OF_MONTH_ABBREV:   // 'b'
  4153                 case DateTime.NAME_OF_MONTH_ABBREV_X: // 'h' -- same b
  4154                 case DateTime.NAME_OF_MONTH_ABBREV_X: // 'h' -- same b
  4154                 case DateTime.NAME_OF_MONTH:        { // 'B'
  4155                 case DateTime.NAME_OF_MONTH:        { // 'B'
  4155                     int i = t.get(ChronoField.MONTH_OF_YEAR) - 1;
  4156                     int i = t.get(ChronoField.MONTH_OF_YEAR) - 1;
  4156                     Locale lt = ((l == null) ? Locale.US : l);
  4157                     Locale lt = Objects.requireNonNullElse(l, Locale.US);
  4157                     DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt);
  4158                     DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt);
  4158                     if (c == DateTime.NAME_OF_MONTH)
  4159                     if (c == DateTime.NAME_OF_MONTH)
  4159                         sb.append(dfs.getMonths()[i]);
  4160                         sb.append(dfs.getMonths()[i]);
  4160                     else
  4161                     else
  4161                         sb.append(dfs.getShortMonths()[i]);
  4162                         sb.append(dfs.getShortMonths()[i]);
  4221                     print(sb, t, DateTime.MINUTE, l).append(sep);
  4222                     print(sb, t, DateTime.MINUTE, l).append(sep);
  4222                     print(sb, t, DateTime.SECOND, l).append(' ');
  4223                     print(sb, t, DateTime.SECOND, l).append(' ');
  4223                     // this may be in wrong place for some locales
  4224                     // this may be in wrong place for some locales
  4224                     StringBuilder tsb = new StringBuilder();
  4225                     StringBuilder tsb = new StringBuilder();
  4225                     print(tsb, t, DateTime.AM_PM, l);
  4226                     print(tsb, t, DateTime.AM_PM, l);
  4226                     sb.append(tsb.toString().toUpperCase(l != null ? l : Locale.US));
  4227                     sb.append(tsb.toString().toUpperCase(Objects.requireNonNullElse(l, Locale.US)));
  4227                     break;
  4228                     break;
  4228                 }
  4229                 }
  4229                 case DateTime.DATE_TIME:    { // 'c' (Sat Nov 04 12:02:33 EST 1999)
  4230                 case DateTime.DATE_TIME:    { // 'c' (Sat Nov 04 12:02:33 EST 1999)
  4230                     char sep = ' ';
  4231                     char sep = ' ';
  4231                     print(sb, t, DateTime.NAME_OF_DAY_ABBREV, l).append(sep);
  4232                     print(sb, t, DateTime.NAME_OF_DAY_ABBREV, l).append(sep);