Qual é o uso de “lenient”?

Aqui lenient é usado em Java DateFormat . Eu chequei o documento, mas não entendi o que estava dizendo.

Qualquer corpo pode me dizer qual é o uso deste lenient , com um exemplo em tempo real, onde o usamos?

O javadoc afirma claramente:

Especifique se a análise de data / hora deve ou não ser leniente. Com a análise branda, o analisador pode usar heurísticas para interpretar inputs que não correspondem precisamente ao formato desse object. Com uma análise estrita, as inputs devem corresponder ao formato desse object.

Portanto, se você tiver um padrão e criar um object de data que corresponda estritamente ao seu padrão, defina lenient como false . Além disso, o DateFormat é leniente, por padrão.

Basicamente, DateFormat define Calendar.setLenient e os estados de Javadoc:

Especifica se a interpretação de data / hora deve ou não ser leniente. Com uma interpretação leniente, uma data como “Fevereiro de 942, 1996” será tratada como equivalente ao 941º dia após 1º de fevereiro de 1996. Com uma interpretação estrita (não leniente), tais datas farão com que uma exceção seja lançada. O padrão é leniente.

Por exemplo, isto:

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

resulta em:

 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) 

Meu conselho é sempre se tornar indulgente. Não consigo pensar em um caso em que você queira tolerância e essa configuração nunca deveria ter sido o padrão para classs como SimpleDateFormat. O processamento lenient pode interpretar o lixo como sequências de tempo válidas e abre erros que podem ser difíceis de detectar nos testes. Além disso, se você estiver usando lenient para tolerar variações no formato de hora você vai se queimar. Por exemplo:

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

Produz isso (seu fuso horário pode variar):

 Mon Nov 02 00:00:00 EST 2009 

Este resultado absurdo parece ser o menos um mês (“-1”), segundo dia (“2-“) de 2010. O mês de zeroth é dezembro!

Infelizmente, usar setLenient (false) não leva a uma interpretação estrita do padrão. SimpleDateFormat tolerará o lixo após a correspondência de padrões, conforme discutido aqui:

SimpleDateFormat.parse () ignora o número de caracteres no padrão

Além disso, não é estrito quanto ao número de caracteres padrão, como “d” em vez de “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")); 

Rendimentos:

 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 

Também com setLenient (false) “2010/01/5” é aceito com o padrão “aaaa / MM / dd”. E discordância de dados é ignorada, como “1999/2011” com o padrão “yyyy / yyyy” (resposta é 2011).

Usando SimpleDateFormat para validar seqüências de data / hora infelizmente não é confiável. Se você seguir o link acima, você verá algumas soluções, incluindo uma versão mais estrita do SimpleDateFormat escrita por mim!

Se a data não for leniente, ela lançará um erro se você ultrapassar a data do intervalo, mas se não for, aceitará e consertará. Por exemplo, no August 61st comentário acima será em 30 de setembro. Doc de Java sobre como configurá-lo. O padrão é verdadeiro.

O object DateFormat é leniente por padrão.

Leniência (Javadoc – Calendário)

O calendar tem dois modos para interpretar os campos do calendar, lenientes e não lenientes. Quando um calendar está no modo leniente, ele aceita um intervalo maior de valores de campo de calendar do que produz. Quando um calendar recalcular valores de campo de calendar para retorno por get (), todos os campos de calendar são normalizados. Por exemplo, um GregorianCalendar leniente interpreta MONTH == JANUARY, DAY_OF_MONTH == 32 como 1 de fevereiro.

Quando um calendar está no modo não leniente, ele lança uma exceção se houver alguma inconsistência em seus campos de calendar. Por exemplo, um GregorianCalendar sempre produz valores de DAY_OF_MONTH entre 1 e a duração do mês. Um não-leniente GregorianCalendar lança uma exceção ao calcular seus valores de campo de tempo ou calendar se qualquer valor de campo fora do intervalo tiver sido definido.

Você pode definir o analisador de datas como não leniente se você quiser que ele aceite estritamente um formato de data que você forneceu. Está bem explicado no documento :

Por padrão, a análise é leniente: se a input não estiver no formato usado pelo método format do object, mas ainda puder ser analisada como uma data, a análise será bem-sucedida. Os clientes podem insistir na adesão estrita ao formato chamando setLenient(false) .

Leniência refere-se a se uma regra estrita será aplicada na análise. Se um object DateFormat for leniente, ele aceitará o dia 32 de janeiro de 2005. Na verdade, ele terá a liberdade de convertê-lo em 1 de fevereiro de 2006. Por padrão, um object DateFormat é indulgente.

 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) { } } } 

E o resultado:

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