2017-01-05 4 views
2

일주일의 문자열 표현을 비교하고 싶습니다. 주 "01/17"은 "02/17"이전이고 "52/16"다음입니다.자바를 사용하여 비교를 위해 주 문자열을 구문 분석합니다. 8

다음 코드는 예외를 throw합니다. 내 문자열이 매주 정확한 날짜를 알려주지 않기 때문입니다. 그러나 월요일이나 목요일 또는 기타 일 수도 있습니다.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ww/YY", Locale.GERMANY); 
LocalDate date1 = formatter.parse(str1, LocalDate::from); 

파서를 수정해야합니까? 또는 다른 형식으로 구문 분석합니까? Unfortunatley에는 YearMonth와 같은 객체가 없습니다.

+1

"주"에 대한 귀하의 정의는 정확히 여기에 있습니까? –

답변

5

하나의 솔루션을 같은 날 월요일에 말하기. 당신은 그것을 위해 사용자 정의 포매터를 만들 수 : 1월 17일이 16분의 52 후이기 때문에 true를 인쇄

LocalDate d1 = LocalDate.parse("01/17", fmt); 
LocalDate d2 = LocalDate.parse("52/16", fmt); 
System.out.println(d1.isAfter(d2)); 

: 이제 LocalDate 주어진 주 월요일을 나타내는 S를 구축 할 수 있습니다

DateTimeFormatter fmt = new DateTimeFormatterBuilder() 
      .appendPattern("ww/YY") 
      .parseDefaulting(ChronoField.DAY_OF_WEEK, 1) 
      .toFormatter(Locale.GERMANY); 

.

+0

위대한, parseDefaulting()은 빠진 조각이었습니다 :) – Tom

2

DateTimeFormatter 클래스에서 작동하는 방법을 찾을 수 없지만 다른 접근 방법을 제안하고자합니다.

Threeten Extra library에는 java.time 라이브러리에 포함하기에 너무 구체적인 클래스가 포함되어 있습니다. 그들 중 하나는 언급 한 YearWeek 클래스입니다.

귀하의 문제는이 같은 YearWeek 제작자-메소드를 호출 한 후 입력 문자열에서 수동으로 주 번호 및 연도를 분석하고 해결할 수 있습니다 : 항상 기본값하는 것

YearWeek yw = YearWeek.of(year, monthOfYear); 
+1

고마워,이 라이브러리에 대해 잘 알고 있습니다. 내가 아주 이상한 것을 발견 한 것은 패턴 문자열을 통한 포맷터 빌드가 from()을 사용하여 YearWeek를 만드는 데 필요한 세부 정보를 제공하지 못한다는 것입니다. 그러나 DateTimeFormatterBuilder를 통해 생성 된 함수가 작동합니다. 하지만 config에서 패턴을 제공하고자하므로 불행합니다. – Tom

+2

@Tom 또는 대안 - 더 많은 추가 기능 - 또한 내 lib Time4J [CalendarWeek] 클래스를 제공합니다 (http://time4j.net/javadoc-en/net/time4j/range/CalendarWeek.html) 좋은 i18n 포함 -support 및 week-arithmetic ('plusWeeks()'와 같은 메소드 사용). Threeten-Extra에서 둘 다 누락되었습니다. 하지만 캘린더를 비교하는 경우에만 추가 의존성을 추가하는 것이 필요하지는 않습니다. –

2

TL; DR

YearWeek.parse("2017-W01") 

ISO

또는 다른 형식으로 구문 분석 8601?

예. 다른 형식을 사용하십시오.

날짜 - 시간 값을 텍스트로 직렬화 할 때 표준 ISO 8601 형식을 사용하십시오. 표준에는 support for week dates이 포함됩니다.

1 년 동안 4 자리 숫자, 하이픈, W 및 해당 주에 2 자리 숫자입니다.

2017-W01

가져 오기에 "주"의 당신의 정의에 명확.

  • 금주 # 1 올해의 첫 번째 목요일을 포함하고
  • 를 실행합니다 월요일 - 일요일은 ISO 8601 정의는 점이다.

그래서 52,53 주를 실행합니다. 그리고이 정의에 따르면, 연중 처음 몇 일이 주 번호로 매겨 질 때 전년도에있을 수 있습니다. 마찬가지로, 연중 마지막 며칠 동안 일주일 넘버링이 다음 해에있을 수 있습니다.

해당 요일에 특정 요일을 나타내려면 월요일 - 일요일에 1-7을 실행하는 하이픈과 한 자리 숫자를 추가하십시오.

팁 : 기본적으로 컴퓨터에서 ISO 8601 주 번호를 보려면 OS 설정을 조정해야 할 수 있습니다. 예를 들어, macOS에서 Calendar.app과 같은 앱이이 표준 정의로 주 번호를 표시하도록하려면 시스템 환경 설정> 언어 & 지역> 캘린더> ISO 8601을 설정하십시오.

2017-W01-7

그런데

, 비슷한 표현의 몇 :

  • 년과에서 실행되는 일상의 년 수를 의미 수적 날짜 1 - 366은 연도, 하이픈 및 3 자리 숫자입니다. 2017-123
  • 연도가없는 월의 일수는 하이픈, 월, 하이픈 및 일 숫자 두 개입니다. --01-07

질문에 표시된 Locale의 사용은 표준 ISO 8601 형식과 관련이 없습니다.

YearWeek

주에 대한 월 (1 년 기준)와 같은 어떤 개체가 없습니다 Unfortunatley

...

아,하지만이 같은 클래스입니다.

일주일 아이디어를 직접 표현하는 클래스는 correct Answer by Henrik을 참조하십시오. 그 대답은 ThreeTen-Extra 라이브러리의 클래스 YearWeek을 보여줍니다.

YearWeek 클래스는 표준 형식으로 문자열을 직접 구문 분석하고 생성 할 수 있습니다.

YearWeek yw = YearWeek.parse("2017-W01"); 

당신은 방법으로 YearWeek 객체를 비교할 수 compareTo, equals, isBefore, isAfter을.

yw.isBefore(thatYw) 

ThreeTen - 추가 프로젝트는 유용하게 사용할 수있는 등 YearQuarter 같은 다른 클래스를 제공합니다.

관련 문제