|
1 | 1 | /* |
2 | | - * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. |
| 2 | + * Copyright (c) 2012, 2026, Oracle and/or its affiliates. All rights reserved. |
3 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | 4 | * |
5 | 5 | * This code is free software; you can redistribute it and/or modify it |
|
59 | 59 | */ |
60 | 60 | package test.java.time.format; |
61 | 61 |
|
| 62 | +import static java.time.format.DateTimeFormatter.*; |
62 | 63 | import static java.time.temporal.ChronoField.DAY_OF_MONTH; |
63 | 64 |
|
64 | 65 | import static org.junit.jupiter.api.Assertions.assertEquals; |
|
93 | 94 | import java.time.temporal.TemporalAccessor; |
94 | 95 | import java.util.Locale; |
95 | 96 | import java.util.function.Function; |
| 97 | +import java.util.stream.Stream; |
96 | 98 |
|
97 | 99 | import org.junit.jupiter.api.Test; |
98 | 100 | import org.junit.jupiter.api.TestInstance; |
99 | 101 | import org.junit.jupiter.params.ParameterizedTest; |
| 102 | +import org.junit.jupiter.params.provider.Arguments; |
100 | 103 | import org.junit.jupiter.params.provider.MethodSource; |
101 | 104 |
|
| 105 | +import static org.junit.jupiter.api.Assertions.assertEquals; |
| 106 | + |
102 | 107 | /** |
103 | 108 | * Test DateTimeFormatter. |
104 | | - * @bug 8085887 8293146 |
| 109 | + * @bug 8085887 8293146 8210336 |
105 | 110 | */ |
106 | 111 | @TestInstance(TestInstance.Lifecycle.PER_CLASS) |
107 | 112 | public class TestDateTimeFormatter { |
@@ -333,4 +338,49 @@ public void test_week_53(String weekDate, Locale locale, LocalDate expected) { |
333 | 338 | assertThrows(DateTimeException.class, () -> LocalDate.parse(weekDate, f)); |
334 | 339 | } |
335 | 340 | } |
| 341 | + |
| 342 | + private static Stream<Arguments> data_iso_short_offset_parse() { |
| 343 | + return Stream.of( |
| 344 | + Arguments.of("20260123-01", BASIC_ISO_DATE, "20260123-0100"), |
| 345 | + Arguments.of("20260123+00", BASIC_ISO_DATE, "20260123Z"), |
| 346 | + Arguments.of("20260123-00", BASIC_ISO_DATE, "20260123Z"), |
| 347 | + Arguments.of("2026-01-23-01", ISO_DATE, "2026-01-23-01:00"), |
| 348 | + Arguments.of("2026-01-23+00", ISO_DATE, "2026-01-23Z"), |
| 349 | + Arguments.of("2026-01-23-00", ISO_DATE, "2026-01-23Z"), |
| 350 | + Arguments.of("2026-01-23T11:30:59-01", ISO_DATE_TIME, "2026-01-23T11:30:59-01:00"), |
| 351 | + Arguments.of("2026-01-23T11:30:59+00", ISO_DATE_TIME, "2026-01-23T11:30:59Z"), |
| 352 | + Arguments.of("2026-01-23T11:30:59-00", ISO_DATE_TIME, "2026-01-23T11:30:59Z"), |
| 353 | + Arguments.of("11:30:59-01", ISO_TIME, "11:30:59-01:00"), |
| 354 | + Arguments.of("11:30:59+00", ISO_TIME, "11:30:59Z"), |
| 355 | + Arguments.of("11:30:59-00", ISO_TIME, "11:30:59Z"), |
| 356 | + Arguments.of("2026-01-23-01", ISO_OFFSET_DATE, "2026-01-23-01:00"), |
| 357 | + Arguments.of("2026-01-23+00", ISO_OFFSET_DATE, "2026-01-23Z"), |
| 358 | + Arguments.of("2026-01-23-00", ISO_OFFSET_DATE, "2026-01-23Z"), |
| 359 | + Arguments.of("2026-01-23T11:30:59-01", ISO_OFFSET_DATE_TIME, "2026-01-23T11:30:59-01:00"), |
| 360 | + Arguments.of("2026-01-23T11:30:59+00", ISO_OFFSET_DATE_TIME, "2026-01-23T11:30:59Z"), |
| 361 | + Arguments.of("2026-01-23T11:30:59-00", ISO_OFFSET_DATE_TIME, "2026-01-23T11:30:59Z"), |
| 362 | + Arguments.of("11:30:59-01", ISO_OFFSET_TIME, "11:30:59-01:00"), |
| 363 | + Arguments.of("11:30:59+00", ISO_OFFSET_TIME, "11:30:59Z"), |
| 364 | + Arguments.of("11:30:59-00", ISO_OFFSET_TIME, "11:30:59Z"), |
| 365 | + Arguments.of("2026-023-01", ISO_ORDINAL_DATE, "2026-023-01:00"), |
| 366 | + Arguments.of("2026-023+00", ISO_ORDINAL_DATE, "2026-023Z"), |
| 367 | + Arguments.of("2026-023-00", ISO_ORDINAL_DATE, "2026-023Z"), |
| 368 | + Arguments.of("2026-W04-5-01", ISO_WEEK_DATE, "2026-W04-5-01:00"), |
| 369 | + Arguments.of("2026-W04-5+00", ISO_WEEK_DATE, "2026-W04-5Z"), |
| 370 | + Arguments.of("2026-W04-5-00", ISO_WEEK_DATE, "2026-W04-5Z"), |
| 371 | + Arguments.of("2026-01-23T11:30:59-01", ISO_ZONED_DATE_TIME, "2026-01-23T11:30:59-01:00"), |
| 372 | + Arguments.of("2026-01-23T11:30:59+00", ISO_ZONED_DATE_TIME, "2026-01-23T11:30:59Z"), |
| 373 | + Arguments.of("2026-01-23T11:30:59-00", ISO_ZONED_DATE_TIME, "2026-01-23T11:30:59Z"), |
| 374 | + Arguments.of("2026-01-23T11:30:59-01", ISO_INSTANT, "2026-01-23T12:30:59Z"), |
| 375 | + Arguments.of("2026-01-23T11:30:59+00", ISO_INSTANT, "2026-01-23T11:30:59Z"), |
| 376 | + Arguments.of("2026-01-23T11:30:59-00", ISO_INSTANT, "2026-01-23T11:30:59Z") |
| 377 | + ); |
| 378 | + } |
| 379 | + |
| 380 | + // Checks if predefined ISO formatters can parse hour-only offsets |
| 381 | + @ParameterizedTest |
| 382 | + @MethodSource("data_iso_short_offset_parse") |
| 383 | + public void test_iso_short_offset_parse(String text, DateTimeFormatter formatter, String expected) { |
| 384 | + assertEquals(expected, formatter.format(formatter.parse(text))); |
| 385 | + } |
336 | 386 | } |
0 commit comments