On Mon, 9 Oct 2023 23:21:57 GMT, Shaojin Wen <d...@openjdk.org> wrote:

>> j.u.Formatter now prints "%tF" (iso standard date) and the result is 
>> incorrect when processing year < 0 or year > 9999
>
> Shaojin Wen has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   No longer localize printed numbers

# Summary
Keep the behavior of String.format('%tF') when printing LocalDate consistent 
with the behavior of DateTimeFormatter.ISO_LOCAL_DATE.


# Problem
1. When using String.format('%tF', localDate), use 
get(ChronoField.YEAR_OF_ERA). When the value range is not [0,9999], the 
behavior is inconsistent with DateTimeFormatter.ISO_LOCAL_DATE.format.
2. When String.format('%tF', localDate), Locale will be processed, which is 
inconsistent with the standard.

* the year value range [-∞, -1] changes:
``` java
String.format("%tF", LocalDate.of(-10000, 1, 1))
// String.format 10001-01-01
// DateTimeFormatter  -99999-01-01


* the year value range [10000, +∞] changes:

String.format("%tF", LocalDate.of(10000, 1, 1)):
// String.format 10000-01-01
// DateTimeFormatter.format  +10000-01-01
And the "%tF" format no longer handles Locale when printing numbers.



Locale.setDefault(
        Locale.forLanguageTag("th-TH-u-nu-thai"));
String.format("%tF", LocalDate.of(2001, 1, 1));
// String.format ๒๐๐๑-๐๑-๐๑
// DateTimeFormatter.ISO_LOCAL_DATE.format 2001-01-01


# Solution
1. When String.format('%tF', localDate) uses ChronoField.YEAR instead of 
ChronoField.YEAR_OF_ERA, when year > 9999, the prefix is added with '+'
2. And don't use Locale to print numbers.


# Specification
* [-∞, -1000]

String.format("%tF", LocalDate.of(-10000, 1, 1))
// -99999-01-01


The year value range [-999, -1], padded to 4 digits

String.format("%tF", LocalDate.of(-1, 1, 1))
// -0001-01-01



The year value range [1, 9999], padded to 4 digits

String.format("%tF", LocalDate.of(1, 1, 1))
// 0001-01-01


* The year value range [10000, -∞], prefix prints '+'

String.format("%tF", LocalDate.of(10000, 1, 1))
// +10000-01-01


#  Risk
1. When String.format('%tF') processes LocalDate/ZonedDateTime/OffsetDateTime, 
if the value range of year is not in [0-9999], the output will be different 
from before.
2. When the Locale of String.format('%tF') is "th-TH-u-nu-thai", the printed 
result is different from before.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/16033#issuecomment-1758959859

Reply via email to