[SCALA] 왜 SimpleDateFormat의 잘못된 날짜를 구문 분석 하는가?
SCALA왜 SimpleDateFormat의 잘못된 날짜를 구문 분석 하는가?
나는 문자열 형식으로 날짜를하고 난 날짜 폴더의 유틸리티로 그 구문 분석합니다.
var date ="03/11/2013"
나는이 같이 분석하고있다 :
new SimpleDateFormat("MM/dd/yyyy").parse(date)
그러나 이상한 것은 그이다, 나는 "03-08-201309 hjhkjhk"또는 "03-88-2013"또는 43-88-201378 "을 통과하고있는 경우,이 오류가 발생하지 않습니다, 그것을 구문 분석합니다.
이를 위해 지금은 날짜의 입력이 올바른지 여부를 확인하기위한 정규식 패턴을 작성해야합니다. 하지만 왜 이렇게입니까 ??
코드 :
scala> val date="03/88/201309 hjhkjhk"
date: java.lang.String = 03/88/201309 hjhkjhk
scala> new SimpleDateFormat("MM/dd/yyyy").parse(date)
res5: java.util.Date = Mon May 27 00:00:00 IST 201309
해결법
-
==============================
1.당신은 DateFormat.setLenient (거짓)를 사용한다 :
당신은 DateFormat.setLenient (거짓)를 사용한다 :
SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy"); df.setLenient(false); df.parse("03/88/2013"); // Throws an exception
나는 당신이 예상하는 것보다 더 관대에도 setLenient (false)를 가진 것을 기억하는 것 - - 나는 확실히 그건 당신이 원하는 모든 것을 잡을 것 아니에요하지만 예를 들어 무효 월 번호를 잡을 것이다.
나는, 예를 들어, 후행 텍스트를 잡을 것입니다 생각하지 않는다 "2013년 3월 1일 sjsjsj". 구문 분석이 완료된 후에는 잠재적으로 ParsePosition의를 받아들이는 구문 분석의 오버로드를 사용할 수 있습니다, 현재 구문 분석 인덱스를 확인 :
ParsePosition position = new ParsePosition(0); Date date = dateFormat.parse(text, position); if (position.getIndex() != text.length()) { // Throw an exception or whatever else you want to do }
그리고 일반적으로 청소기 날짜 / 시간 API 어쨌든입니다 - 당신은 또한 잘 엄격한 해석을 허용 할 수있다 Joda 시간 API 봐야한다.
-
==============================
2.존 소총의 대답은 정확하고 그것이 2013 년에 쓰여진 좋은 대답했다.
존 소총의 대답은 정확하고 그것이 2013 년에 쓰여진 좋은 대답했다.
그러나 귀하의 질문에, SimpleDateFormat의 및 날짜에 사용하는 클래스가, 지금은 긴 구식이되어, 누군가가 그들 오늘과 비슷한 문제를 가지고 그렇다면, 이럴 최선의 답은 현대적인 자바 날짜 및 시간 API를 사용하여 변화하는 것입니다.
난 당신이 자바와 함께 살 것이다, 그래서 미안 해요, 스칼라 코드를 작성할 수 없습니다입니다. 내가 사용하고
private static DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy");
의미는 약간 차이가 있지만 형식 패턴 문자, 당신의 문제와 동일합니다. 우리가 살펴 보 겠지만 DateTimeFormatter는 그대로 패턴 문자의 수를합니다. 이제 우리는 시도 :
System.out.println(LocalDate.parse(date, parseFormatter));
결과 :
존 소총은 오래된 SimpleDateFormat의 엄밀 또는 비 관대 될 수 있음을 설명했다. 이것은, '관대'라는 사실은 3 대신 2의 해결 스타일을 가지고, 너무 DateTimeFormatter 마찬가지입니다 '스마트'와 '엄격한'. 많은 프로그래머가이 인식하지 때문에,하지만, 나는 그들이 '관대 한'기본 ( '스마트'를한다) 제작하지 않는 좋은 선택을했다고 생각.
우리가 우리의 포맷터 관대을하고 싶다면?
private static DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy") .withResolverStyle(ResolverStyle.LENIENT);
지금은 2013년 5월 27일에 "03/88/2013"을 구문 분석합니다. 3 월 초 88 일 계산하는 것은 또 다른 오류 메시지가 여전히 동일 월 27 제공 :이 이전 클래스도했을 것입니다 생각합니다. 즉 여전히 6 자리 연도와 하이픈에, 구문 분석되지 않은 텍스트 객체.
질문 : 수 있습니까 내 자바 버전으로 현대 API를 사용할 수 있습니까?
자바 6 이상에서 사용하는 경우, 당신은 할 수 있습니다.
from https://stackoverflow.com/questions/15336200/why-does-simpledateformat-parse-incorrect-date by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] TimeoutException을 수신 가능한 이유는 무엇입니까 : 선물은 [n 초] 후 시간 초과 스파크로 작업 할 때 [중복] (0) | 2019.11.07 |
---|---|
[SCALA] 암시 적 변환의 결과 유형은 AnyRef보다 더 구체적이어야합니다 (0) | 2019.11.07 |
[SCALA] 어떻게 목록 Column.isin를 사용 하는가? (0) | 2019.11.07 |
[SCALA] 미래의 내 보낸 (0) | 2019.11.07 |
[SCALA] 디폴트가 사용됩니다 암시하는 변환을 제어 할 수있는 방법이 있습니까? (0) | 2019.11.07 |