Подтвердить что ты не робот

Какая польза от "мягкой"?

Здесь lenient используется в Java DateFormat. Я проверил документ, но не понял, что он говорит.

Может ли какой-нибудь орган рассказать мне, что такое использование lenient, с одним примером в реальном времени, где мы его используем?

4b9b3361

Ответ 1

javadoc четко заявляет:

Укажите, следует ли смягчать синтаксический анализ даты и времени. С мягкий синтаксический анализ, анализатор может использовать эвристику для интерпретации входов которые точно не соответствуют этому объекту. При строгом разборе, Входы должны соответствовать этому объекту.

Итак, если у вас есть шаблон и создать объект даты, который строго соответствует вашему шаблону, установите lenient в false. Кроме того, по умолчанию DateFormat является снисходительным.

В принципе, DateFormat устанавливает Calendar.setLenient, а Javadoc:

Определяет, является ли интерпретация даты/времени мягкой. При мягкой интерпретации такая дата, как "Февраль 942, 1996", будет считаться эквивалентным 941-й день после 1 февраля, 1996. При строгой (не-доброжелательной) интерпретации такие даты будут исключение. Значение по умолчанию является мягким.

Ответ 2

Например:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy");
System.out.println(simpleDateFormat.parse("0"));
simpleDateFormat.setLenient(false);
System.out.println(simpleDateFormat.parse("0"));

приводит к:

Thu Jan 01 00:00:00 CET 1
Exception in thread "main" java.text.ParseException: Unparseable date: "0"
    at java.text.DateFormat.parse(Unknown Source)
    at net.java.quickcheck.generator.support.X.main(X.java:28)

Ответ 3

Мой совет - всегда отключаться. Я не могу придумать случай, когда вы хотите снисходительно, и этот параметр никогда не должен был использоваться по умолчанию для таких классов, как SimpleDateFormat. Обработка Lenient может интерпретировать мусор как действительные строки времени и открывает ошибки, которые могут быть трудно поймать при тестировании. Кроме того, если вы используете lenient, чтобы терпеть изменения в формате времени, вы собираетесь сожжены. Например:

System.out.println(new SimpleDateFormat("yyyyMMdd").parse("2010-12-30"));

Удерживает это (ваш часовой пояс может меняться):

Mon Nov 02 00:00:00 EST 2009

Этот абсурдный результат представляет собой минус один месяц ( "-1" ), второй день ( "2-" ) 2010 года. Нулевой месяц - декабрь!

К сожалению, использование setLenient (false) не приводит к строгой интерпретации шаблона. SimpleDateFormat будет терпеть мусор после соответствия шаблону, как описано здесь:

SimpleDateFormat.parse() игнорирует количество символов в шаблоне

Кроме того, он не является строгим по отношению к числу символов шаблонов, таких как "d" вместо "dd":

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/d");
sdf.setLenient(false);
System.out.println("For 5:  " + sdf.parse("2010/01/5"));
System.out.println("For 05: " + sdf.parse("2010/01/05"));
System.out.println("For 15: " + sdf.parse("2010/01/15"));

Урожайность:

For 5:  Tue Jan 05 00:00:00 EST 2010
For 05: Tue Jan 05 00:00:00 EST 2010
For 15: Fri Jan 15 00:00:00 EST 2010

Также с setLenient (false) "2010/01/5" принимается шаблон "yyyy/MM/dd". И несогласие данных игнорируется, например, "1999/2011" с шаблоном "yyyy/yyyy" (ответ - 2011).

Использование SimpleDateFormat для проверки строк даты/времени к сожалению ненадежно. Если вы перейдете по ссылке выше, вы увидите некоторые решения, в том числе более строгую версию SimpleDateFormat, написанную мной!

Ответ 4

Если дата не является мягкой, она будет вызывать ошибку, если вы выйдете из диапазона, но если нет, то она примет и исправит ее. например, August 61st из комментария выше будет 30 сентября. Java doc о том, как его установить. Значение по умолчанию - true.

Ответ 5

Объект DateFormat по умолчанию мягкий.

Недостаток (Javadoc - Календарь)

Календарь имеет два режима для интерпретации полей календаря, мягкий и не снисходителен. Когда Календарь находится в режиме смягчения, он принимает более широкий диапазон значений поля календаря, чем он производит. Когда календарь пересчитывает значения полей календаря для возврата методом get(), все поля календаря нормированы. Например, снисходительный GregorianCalendar интерпретирует MONTH == ЯНВАРЬ, DAY_OF_MONTH == 32 as 1 февраля.

Когда календарь находится в режиме без снисхождения, он генерирует исключение, если в его календарных полях существует какая-либо несогласованность. Например, GregorianCalendar всегда производит значения DAY_OF_MONTH между 1 и длина месяца. Нежелательный григорианский календарь бросает исключение при расчете его времени или значений поля календаря, если таковые имеются значение поля вне диапазона установлено.

Ответ 6

Вы можете установить парсер даты как не снисходительный, если хотите, чтобы он принимал строго формат даты, который вы предоставили. Это хорошо объяснено в документе:

По умолчанию разбор является мягким: если вход не находится в форме, используемой этим методом объектного формата, но все равно может быть проанализирован как дата, тогда синтаксический анализ завершается успешно. Клиенты могут настаивать на строгом соблюдении формата, вызывая setLenient(false).

Ответ 7

Недостаток означает, будет ли строгое правило применяться при разбор. Если объект DateFormat является снисходительным, он примет значение 32, 2005. Фактически, он будет свободен преобразовать его до 1 февраля 2006 года. По умолчанию объект DateFormat является мягким.

import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;

public class MainClass {
  public static void main(String[] args) {
    DateFormat shortDf = DateFormat.getDateInstance(DateFormat.SHORT);

    DateFormat mediumDf = DateFormat.getDateInstance(DateFormat.MEDIUM);
    DateFormat longDf = DateFormat.getDateInstance(DateFormat.LONG);
    DateFormat fullDf = DateFormat.getDateInstance(DateFormat.FULL);
    System.out.println(shortDf.format(new Date()));
    System.out.println(mediumDf.format(new Date()));
    System.out.println(longDf.format(new Date()));
    System.out.println(fullDf.format(new Date()));

    // parsing
    try {
      Date date = shortDf.parse("Jan 32, 2005");
    } catch (ParseException e) {
    }
  }
}

И результат:

1/26/07
Jan 26, 2007
January 26, 2007
Friday, January 26, 2007