< prev index next >

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

Print this page

        

*** 1772,1791 **** } else if (cur == 'W') { // Fields defined by Locale if (count > 1) { throw new IllegalArgumentException("Too many pattern letters: " + cur); } ! appendInternal(new WeekBasedFieldPrinterParser(cur, count)); } else if (cur == 'w') { // Fields defined by Locale if (count > 2) { throw new IllegalArgumentException("Too many pattern letters: " + cur); } ! appendInternal(new WeekBasedFieldPrinterParser(cur, count)); } else if (cur == 'Y') { // Fields defined by Locale ! appendInternal(new WeekBasedFieldPrinterParser(cur, count)); } else { throw new IllegalArgumentException("Unknown pattern letter: " + cur); } pos--; --- 1772,1795 ---- } else if (cur == 'W') { // Fields defined by Locale if (count > 1) { throw new IllegalArgumentException("Too many pattern letters: " + cur); } ! appendValue(new WeekBasedFieldPrinterParser(cur, count, count, count)); } else if (cur == 'w') { // Fields defined by Locale if (count > 2) { throw new IllegalArgumentException("Too many pattern letters: " + cur); } ! appendValue(new WeekBasedFieldPrinterParser(cur, count, count, 2)); } else if (cur == 'Y') { // Fields defined by Locale ! if (count == 2) { ! appendValue(new WeekBasedFieldPrinterParser(cur, count, count, 2)); ! } else { ! appendValue(new WeekBasedFieldPrinterParser(cur, count, count, 19)); ! } } else { throw new IllegalArgumentException("Unknown pattern letter: " + cur); } pos--;
*** 1841,1851 **** } else { appendValue(field, count, 19, SignStyle.EXCEEDS_PAD); } break; case 'c': ! if (count == 2) { throw new IllegalArgumentException("Invalid pattern \"cc\""); } /*fallthrough*/ case 'L': case 'q': --- 1845,1858 ---- } else { appendValue(field, count, 19, SignStyle.EXCEEDS_PAD); } break; case 'c': ! if (count == 1) { ! appendValue(new WeekBasedFieldPrinterParser(cur, count, count, count)); ! break; ! } else if (count == 2) { throw new IllegalArgumentException("Invalid pattern \"cc\""); } /*fallthrough*/ case 'L': case 'q':
*** 1856,1867 **** case 'E': case 'e': switch (count) { case 1: case 2: ! if (cur == 'c' || cur == 'e') { ! appendInternal(new WeekBasedFieldPrinterParser(cur, count)); } else if (cur == 'E') { appendText(field, TextStyle.SHORT); } else { if (count == 1) { appendValue(field); --- 1863,1874 ---- case 'E': case 'e': switch (count) { case 1: case 2: ! if (cur == 'e') { ! appendValue(new WeekBasedFieldPrinterParser(cur, count, count, count)); } else if (cur == 'E') { appendText(field, TextStyle.SHORT); } else { if (count == 1) { appendValue(field);
*** 4769,4793 **** * The specific formatter and parameters is not selected until the * the field is to be printed or parsed. * The locale is needed to select the proper WeekFields from which * the field for day-of-week, week-of-month, or week-of-year is selected. */ ! static final class WeekBasedFieldPrinterParser implements DateTimePrinterParser { private char chr; private int count; /** * Constructor. * * @param chr the pattern format letter that added this PrinterParser. * @param count the repeat count of the format letter */ ! WeekBasedFieldPrinterParser(char chr, int count) { this.chr = chr; this.count = count; } @Override public boolean format(DateTimePrintContext context, StringBuilder buf) { return printerParser(context.getLocale()).format(context, buf); } --- 4776,4843 ---- * The specific formatter and parameters is not selected until the * the field is to be printed or parsed. * The locale is needed to select the proper WeekFields from which * the field for day-of-week, week-of-month, or week-of-year is selected. */ ! static final class WeekBasedFieldPrinterParser extends NumberPrinterParser { private char chr; private int count; /** * Constructor. * * @param chr the pattern format letter that added this PrinterParser. * @param count the repeat count of the format letter + * @param minWidth the minimum field width, from 1 to 19 + * @param maxWidth the maximum field width, from minWidth to 19 + */ + WeekBasedFieldPrinterParser(char chr, int count, int minWidth, int maxWidth) { + this(chr, count, minWidth, maxWidth, 0); + } + + /** + * Constructor. + * + * @param chr the pattern format letter that added this PrinterParser. + * @param count the repeat count of the format letter + * @param minWidth the minimum field width, from 1 to 19 + * @param maxWidth the maximum field width, from minWidth to 19 + * @param subsequentWidth the width of subsequent non-negative numbers, 0 or greater, + * -1 if fixed width due to active adjacent parsing */ ! WeekBasedFieldPrinterParser(char chr, int count, int minWidth, int maxWidth, ! int subsequentWidth) { ! super(null, minWidth, maxWidth, SignStyle.NOT_NEGATIVE, subsequentWidth); this.chr = chr; this.count = count; } + /** + * Returns a new instance with fixed width flag set. + * + * @return a new updated printer-parser, not null + */ + @Override + WeekBasedFieldPrinterParser withFixedWidth() { + if (subsequentWidth == -1) { + return this; + } + return new WeekBasedFieldPrinterParser(chr, count, minWidth, maxWidth, -1); + } + + /** + * Returns a new instance with an updated subsequent width. + * + * @param subsequentWidth the width of subsequent non-negative numbers, 0 or greater + * @return a new updated printer-parser, not null + */ + @Override + WeekBasedFieldPrinterParser withSubsequentWidth(int subsequentWidth) { + return new WeekBasedFieldPrinterParser(chr, count, minWidth, maxWidth, + this.subsequentWidth + subsequentWidth); + } + @Override public boolean format(DateTimePrintContext context, StringBuilder buf) { return printerParser(context.getLocale()).format(context, buf); }
*** 4808,4821 **** TemporalField field = null; switch (chr) { case 'Y': field = weekDef.weekBasedYear(); if (count == 2) { ! return new ReducedPrinterParser(field, 2, 2, 0, ReducedPrinterParser.BASE_DATE, 0); } else { return new NumberPrinterParser(field, count, 19, ! (count < 4) ? SignStyle.NORMAL : SignStyle.EXCEEDS_PAD, -1); } case 'e': case 'c': field = weekDef.dayOfWeek(); break; --- 4858,4873 ---- TemporalField field = null; switch (chr) { case 'Y': field = weekDef.weekBasedYear(); if (count == 2) { ! return new ReducedPrinterParser(field, 2, 2, 0, ReducedPrinterParser.BASE_DATE, ! this.subsequentWidth); } else { return new NumberPrinterParser(field, count, 19, ! (count < 4) ? SignStyle.NORMAL : SignStyle.EXCEEDS_PAD, ! this.subsequentWidth); } case 'e': case 'c': field = weekDef.dayOfWeek(); break;
*** 4826,4836 **** field = weekDef.weekOfMonth(); break; default: throw new IllegalStateException("unreachable"); } ! return new NumberPrinterParser(field, (count == 2 ? 2 : 1), 2, SignStyle.NOT_NEGATIVE); } @Override public String toString() { StringBuilder sb = new StringBuilder(30); --- 4878,4889 ---- field = weekDef.weekOfMonth(); break; default: throw new IllegalStateException("unreachable"); } ! return new NumberPrinterParser(field, minWidth, maxWidth, SignStyle.NOT_NEGATIVE, ! this.subsequentWidth); } @Override public String toString() { StringBuilder sb = new StringBuilder(30);
< prev index next >