Program Tip

"관대 한"의 사용은 무엇입니까?

programtip 2020. 12. 15. 19:44
반응형

"관대 한"의 사용은 무엇입니까?


여기는 lenientJava에서 사용됩니다 DateFormat. 문서를 확인했지만 내용을 이해하지 못했습니다.

lenient우리가 그것을 사용하는 실시간 예제를 통해 어떤 신체가 이것의 사용이 무엇인지 말해 줄 수 있습니까?


javadoc에서는 명확하게 진술한다 :

날짜 / 시간 구문 분석이 관대한지 여부를 지정하십시오. 관대 한 파싱을 사용하면 파서가 휴리스틱을 사용하여이 개체의 형식과 정확히 일치하지 않는 입력을 해석 할 수 있습니다. 엄격한 구문 분석을 사용하면 입력이이 개체의 형식과 일치해야합니다.

따라서 패턴이 있고 패턴과 엄격하게 일치 하는 날짜 객체를 만드는 경우 lenient를 false. 또한 DateFormat기본적으로 관대합니다.

기본적으로 DateFormat세트 Calendar.setLenient및 Javadoc은 다음과 같이 설명합니다.

날짜 / 시간 해석이 관대한지 여부를 지정합니다. 관대하게 해석하면 "1996 년 2 월 942"와 같은 날짜는 1996 년 2 월 1 일 이후 941 일에 해당하는 것으로 간주됩니다. 엄격한 (비 관대 한) 해석을 사용하면 이러한 날짜는 예외가 발생합니다. 기본값은 관대합니다.


예를 들면 다음과 같습니다.

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)

내 조언은 항상 관대함을 끄라는 것입니다. 관대함을 원하는 경우를 생각할 수 없으며이 설정은 SimpleDateFormat과 같은 클래스의 기본값이 아니어야합니다. 관대 한 처리는 가비지를 유효한 시간 문자열로 해석하고 테스트에서 포착하기 어려울 수있는 오류를 열 수 있습니다. 또한 시간 형식의 변화를 용인하기 위해 관대함을 사용하면 화상을 입을 것입니다. 예를 들면 :

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

결과 (시간대는 다를 수 있음) :

Mon Nov 02 00:00:00 EST 2009

이 어리석은 결과는 마이너스 1 개월 ( "-1"), 2010 년 둘째 날 ( "2-") 인 것으로 보입니다. 0 번째 달은 12 월입니다!

안타깝게도 setLenient (false)를 사용한다고해서 패턴이 엄격하게 해석되는 것은 아닙니다. SimpleDateFormat은 여기에 설명 된대로 패턴 일치 후 가비지를 허용합니다.

SimpleDateFormat.parse ()는 패턴의 문자 수를 무시합니다.

또한 "dd"대신 "d"와 같은 패턴 문자 수에 대해 엄격하지 않습니다.

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"패턴으로 허용됩니다. 그리고 "yyyy / yyyy"패턴이있는 "1999/2011"과 같이 데이터 불일치는 무시됩니다 (답은 2011).

SimpleDateFormat을 사용하여 날짜 / 시간 문자열의 유효성을 검사하는 것은 슬프게도 신뢰할 수 없습니다. 위의 링크를 따라 가면 저에 의해 작성된 SimpleDateFormat의 더 엄격한 버전을 포함하여 몇 가지 솔루션이 표시됩니다!


날짜가 관대하지 않으면 범위를 벗어난 날짜를 전달하면 오류가 발생하지만 그렇지 않은 경우 수락하고 수정합니다. August 61st들어 위의 의견에서 9 월 30 일이됩니다. 설정 방법에 대한 Java 문서 . 기본값은 true입니다.


DateFormat 객체는 기본적으로 관대합니다.

Leniency (Javadoc-캘린더)

달력에는 달력 필드를 해석하는 두 가지 모드 (관대 및 비관 대)가 있습니다. 달력이 관대 모드에 있으면 생성하는 것보다 더 넓은 범위의 달력 필드 값을 받아들입니다. 달력이 get ()에 의한 반환을 위해 달력 필드 값을 다시 계산하면 모든 달력 필드가 정규화됩니다. 예를 들어, 관대 한 GregorianCalendar는 MONTH == JANUARY, DAY_OF_MONTH == 32를 2 월 1 일로 해석합니다.

캘린더가 비 관용 모드에있을 때 캘린더 필드에 불일치가 있으면 예외가 발생합니다. 예를 들어 GregorianCalendar는 항상 1과 월 길이 사이의 DAY_OF_MONTH 값을 생성합니다. 비 관용 GregorianCalendar는 범위를 벗어난 필드 값이 설정된 경우 시간 또는 달력 필드 값을 계산할 때 예외를 발생시킵니다.


Leniency refers to whether or not a strict rule will be applied at parsing. If a DateFormat object is lenient, it will accept Jan 32, 2005. In fact, it will take the liberty of converting it to Feb 1, 2006. By default, a DateFormat object is lenient.

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

And the result:

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

You can set the date parser as not lenient if you want it to accept strictly a date format you provided. It is well explained in the doc:

By default, parsing is lenient: If the input is not in the form used by this object's format method but can still be parsed as a date, then the parse succeeds. Clients may insist on strict adherence to the format by calling setLenient(false).

ReferenceURL : https://stackoverflow.com/questions/7606387/what-is-the-use-of-lenient

반응형