В чем разница между withLocale() и localizedBy() в Java DateTimeFormatter?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 В чем разница между withLocale() и localizedBy() в Java DateTimeFormatter?

Сообщение Anonymous »

Код: Выделить всё

DateTimeFormatter
В Java 8 представлен современный API даты и времени с новыми типами, такими как LocalDate, доступными в пакете java.time.*. Он также предоставил новый класс DateTimeFormatter для форматирования (генерации строк) этих дат и времени.
Чтобы создать экземпляр DateTimeFormatter, следует использовать его статические методы/поля или использовать базовый класс DateTimeFormatterBuilder, как показано ниже:

Код: Выделить всё

DateTimeFormatter.ofPattern("yyyy-MM-dd")
// or
DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)
// or
DateTimeFormatter.ISO_LOCAL_DATE_TIME
// or
new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR).toFormatter()
Все они возвращают неизменяемый экземпляр DateTimeFormatter.
Локализация
Теперь можно переопределить/изменить некоторые аспекты форматтера, вызвав методы .with***(), подобные сборщику, или аналогичные в экземпляре DateTimeFormatter, которые создают новый экземпляр копии с измененным аспектом:

Код: Выделить всё

DateTimeFormatter
.ofPattern("yyyy-MM-dd")
.withChronology(JapaneseChronology.INSTANCE)        // New instance with this chronology
.withDecimalStyle(DecimalStyle.of(Locale.of("fa"))) // New instance with this decimal style
Однако локализация (по крайней мере, система счисления) неверна для следующих случаев:
  • При указании локали для средства форматирования (т. е. неявном использовании локали системы/Java)
  • При установке локали Java по умолчанию с помощью Locale.setDefault(myLocale); и последующего создания экземпляра средства форматирования и его использования
  • При использовании языкового стандарта в методе ofPattern("...", myLocale) DateTimeFormatter
  • При использовании языкового стандарта в методе toFormatter(myLocale) метода DateTimeFormatterBuilder
  • Даже при явном использовании расширений Юникода в нотации языкового стандарта (например, Locale.forLanguageTag("en-u-nu-arabext")) и использование полученного языкового стандарта в withLocale(myLocale)
Что касается устаревших Java DateFormat, ICU4J и JavaScript, описанных ниже, во всех вышеперечисленных случаях должны выдаваться правильные цифры в соответствии с языковым стандартом. Но Java DateTimeFormatter требует дополнительного избыточного вызова localizedBy(myLocale) или withDecimalStyle(DecimalStyle.of(myLocale)). Многие/большинство людей и даже продвинутые программисты используют локаль в методе ofPattern() или в withLocale() вместо использования localizedBy(), и ни один из них не правильно локализует такие вещи, как десятичный стиль (цифры/числа). На мой взгляд, это определенно ошибка, а не функция:
  • Любой DateTimeFormatter#withLocale следует заменить на DateTimeFormatter#localizedBy #910
  • Как отформатировать дату по любому языковому стандарту, полученному из языкового тега со временем Java?
  • (исправлено) Как отформатировать объект LocalDate в ММ/дд/гггг и формат сохраняется
  • (исправлено) SimpleDateFormat и строка формата на основе локали
  • и т. д.
В отличие от withLocale(), localizedBy() даже не упоминается в javadoc верхнего уровня класса DateTimeFormatter или, для например, javadoc метода ofPattern.
Устаревшие классы Java DateFormat и SimpleDateFormat правильно локализуют цифры:

Код: Выделить всё

var myLocale = Locale.forLanguageTag("fa");
var formatter = new SimpleDateFormat("yyyy-MM-dd", myLocale);
var myDate = formatter.parse("2025-06-28");
formatter.format(myDate); // ۲۰۲۵-۰۶-۲۸
ICU4J также правильно форматирует числа как для устаревших, так и для современных типов Java:

Код: Выделить всё

var myLocale = Locale.forLanguageTag("fa");
var formatter = com.ibm.icu.text.SimpleDateFormat("yyyy-MM-dd", myLocale);
var myDate = LocalDate.of(2025, 6, 28);
formatter.format(myDate); // ۱۴۰۴-۰۴-۰۷
Другой пример: JavaScript также правильно локализует все (включая цифры) при форматировании дат с помощью методов toLocaleString() или toLocaleDateString():

Код: Выделить всё

let myDate = new Date(2025, 5, 28);
myDate.toLocaleDateString("fa"); // ۱۴۰۴/۴/۷
Вопрос
  • Каковы именно различия между withLocale() и localizedBy()?
  • Если localizedBy() дает более тщательно локализованный результат, есть ли разумный вариант использования вместо этого вызова withLocale()?
Связанные
  • Как локализовать числа с помощью DateTimeFormatter?
  • Какой смысл в Locale в DateTimeFormatter?
  • Для международных дат и времени следует использовать Unicode ICU, а не java.time.DateTimeFormatter
  • Восточно-арабские цифры
  • Удалить поставщика услуг локали (localespi)


Подробнее здесь: https://stackoverflow.com/questions/797 ... datetimefo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»