|
51 | 51 | import java.util.Locale;
|
52 | 52 | import java.util.Map;
|
53 | 53 | import java.util.Objects;
|
54 |
| -import java.util.function.Consumer; |
| 54 | +import java.util.function.BiConsumer; |
55 | 55 | import java.util.stream.Collectors;
|
56 | 56 |
|
57 | 57 | class JavaDateFormatter implements DateFormatter {
|
58 | 58 |
|
59 | 59 | // base fields which should be used for default parsing, when we round up for date math
|
60 |
| - private static final Map<TemporalField, Long> ROUND_UP_BASE_FIELDS = new HashMap<>(6); |
| 60 | + private static final Map<TemporalField, Long> ROUND_UP_GENERIC_BASE_FIELDS = new HashMap<>(4); |
61 | 61 |
|
62 | 62 | {
|
63 |
| - ROUND_UP_BASE_FIELDS.put(ChronoField.MONTH_OF_YEAR, 1L); |
64 |
| - ROUND_UP_BASE_FIELDS.put(ChronoField.DAY_OF_MONTH, 1L); |
65 |
| - ROUND_UP_BASE_FIELDS.put(ChronoField.HOUR_OF_DAY, 23L); |
66 |
| - ROUND_UP_BASE_FIELDS.put(ChronoField.MINUTE_OF_HOUR, 59L); |
67 |
| - ROUND_UP_BASE_FIELDS.put(ChronoField.SECOND_OF_MINUTE, 59L); |
68 |
| - ROUND_UP_BASE_FIELDS.put(ChronoField.NANO_OF_SECOND, 999_999_999L); |
| 63 | + ROUND_UP_GENERIC_BASE_FIELDS.put(ChronoField.HOUR_OF_DAY, 23L); |
| 64 | + ROUND_UP_GENERIC_BASE_FIELDS.put(ChronoField.MINUTE_OF_HOUR, 59L); |
| 65 | + ROUND_UP_GENERIC_BASE_FIELDS.put(ChronoField.SECOND_OF_MINUTE, 59L); |
| 66 | + ROUND_UP_GENERIC_BASE_FIELDS.put(ChronoField.NANO_OF_SECOND, 999_999_999L); |
69 | 67 | }
|
70 | 68 |
|
71 | 69 | private final String format;
|
@@ -96,14 +94,25 @@ JavaDateFormatter getRoundupParser() {
|
96 | 94 |
|
97 | 95 | // named formatters use default roundUpParser
|
98 | 96 | JavaDateFormatter(String format, DateTimeFormatter printer, DateTimeFormatter... parsers) {
|
99 |
| - this(format, printer, builder -> ROUND_UP_BASE_FIELDS.forEach(builder::parseDefaulting), parsers); |
| 97 | + this(format, printer, ROUND_UP_BASE_FIELDS, parsers); |
100 | 98 | }
|
101 | 99 |
|
| 100 | + private static final BiConsumer<DateTimeFormatterBuilder, DateTimeFormatter> ROUND_UP_BASE_FIELDS = (builder, parser) -> { |
| 101 | + String parserString = parser.toString(); |
| 102 | + if (parserString.contains(ChronoField.DAY_OF_YEAR.toString())) { |
| 103 | + builder.parseDefaulting(ChronoField.DAY_OF_YEAR, 1L); |
| 104 | + } else { |
| 105 | + builder.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1L); |
| 106 | + builder.parseDefaulting(ChronoField.DAY_OF_MONTH, 1L); |
| 107 | + } |
| 108 | + ROUND_UP_GENERIC_BASE_FIELDS.forEach(builder::parseDefaulting); |
| 109 | + }; |
| 110 | + |
102 | 111 | // subclasses override roundUpParser
|
103 | 112 | JavaDateFormatter(
|
104 | 113 | String format,
|
105 | 114 | DateTimeFormatter printer,
|
106 |
| - Consumer<DateTimeFormatterBuilder> roundupParserConsumer, |
| 115 | + BiConsumer<DateTimeFormatterBuilder, DateTimeFormatter> roundupParserConsumer, |
107 | 116 | DateTimeFormatter... parsers
|
108 | 117 | ) {
|
109 | 118 | if (printer == null) {
|
@@ -138,13 +147,16 @@ JavaDateFormatter getRoundupParser() {
|
138 | 147 | * <code>DateFormatters</code>.
|
139 | 148 | * This means that we need to also have multiple RoundUp parsers.
|
140 | 149 | */
|
141 |
| - private List<DateTimeFormatter> createRoundUpParser(String format, Consumer<DateTimeFormatterBuilder> roundupParserConsumer) { |
| 150 | + private List<DateTimeFormatter> createRoundUpParser( |
| 151 | + String format, |
| 152 | + BiConsumer<DateTimeFormatterBuilder, DateTimeFormatter> roundupParserConsumer |
| 153 | + ) { |
142 | 154 | if (format.contains("||") == false) {
|
143 | 155 | List<DateTimeFormatter> roundUpParsers = new ArrayList<>();
|
144 | 156 | for (DateTimeFormatter parser : this.parsers) {
|
145 | 157 | DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
|
146 | 158 | builder.append(parser);
|
147 |
| - roundupParserConsumer.accept(builder); |
| 159 | + roundupParserConsumer.accept(builder, parser); |
148 | 160 | roundUpParsers.add(builder.toFormatter(locale()));
|
149 | 161 | }
|
150 | 162 | return roundUpParsers;
|
|
0 commit comments