"관대 한"의 사용은 무엇입니까?
여기는 lenient
Java에서 사용됩니다 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
'Program Tip' 카테고리의 다른 글
객체 배열에서 잘못된 자바 스크립트 배열 길이 (0) | 2020.12.15 |
---|---|
Java에서 MySQL 날짜 및 타임 스탬프 처리 (0) | 2020.12.15 |
자바 스크립트에서 객체 프로토 타입에 액세스하는 방법은 무엇입니까? (0) | 2020.12.15 |
Fortran이 과학 컴퓨팅에 사용되는 이유는 무엇입니까? (0) | 2020.12.15 |
SQL Server FOR EACH 루프 (0) | 2020.12.15 |