2016-09-20 3 views
3

week-based-year - week-of-week-based-year 형식으로 현재 날짜를 출력해야합니다. 즉, ISO week date을 사용합니다. 여기서 주는 항상 월요일과 첫 주에 시작합니다. 1 월에 최소 4 일 (1 월의 첫 번째 목요일이있는 주)이되는 첫 번째 년입니다.Java Time의 weekton-week-year 패턴 구문 분석 : DateTimeFormatter

2015 년 12 월 31 일이 목요일 이었기 때문에 2016 년 1 월 1 일부터 3 월 3 일까지 금요일부터 일요일까지 모두 2015 년 ("긴 해") 53 번째 주에 속하며 2016 년 첫 주는 월요일에 시작됩니다 1 월 4 일 DateTimeFormatter spec에서

는, 나는 (Yweek-based-year하고 wweek-of-week-based-year입니다) 난 그냥 그렇게 패턴 YYYY-ww을 사용할 수있을 것으로 기대했을 것이다. 나는 다음과 같은 단순화 된 테스트 케이스 같은 것을 할 때

그러나 :

String dateString = "2016-01-03"; 
LocalDate date = LocalDate.parse(dateString, DateTimeFormatter.ofPattern("yyyy-MM-dd")); 
String expectedOutput = "2015-53"; 
String actualOutput = date.format(DateTimeFormatter.ofPattern("YYYY-ww")); 
System.out.println("Parsing " + dateString + ", expected " 
     + expectedOutput + " but got " + actualOutput); 
System.out.println(dateString + " as ISO week date: " 
     + date.format(DateTimeFormatter.ISO_WEEK_DATE)); 

을 나는이 얻을 :

Parsing 2016-01-03, expected 2015-53 but got 2016-02

2016-01-03 as ISO week date: 2015-W53-7

그래서 사용하여 구축 ~ ISO_WEEK_DATE 포맷터가 예상 한대로 작동하지만 패턴 YYYY-ww을 사용하면 달력 년 및 주를 제공하는 것으로 보입니다.

ISO 주간 날짜에 대해 잘못 이해했거나 코드에 오류가 있거나 ... 감히 말하지만 ... java.time 라이브러리의 버그입니까 (this question의 경우)?

저는 아래 에서처럼 사용자 정의 포맷터를 사용하여이 문제를 해결할 수 있지만 제 경우에는 패턴을 사용하여 작업해야한다고 생각합니다.

new DateTimeFormatterBuilder() 
    .parseCaseInsensitive() 
    .appendValue(IsoFields.WEEK_BASED_YEAR, 4, 10, SignStyle.EXCEEDS_PAD) 
    .appendLiteral("-") 
    .appendValue(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 2) 
    .toFormatter(); 

답변

3

설명서에 DateTimeFormatterBuilder은 "Y"가 지역화 된 주 단위의 연도를 추가하도록 지정합니다. 따라서 week-based year와 week 필드의 의미는 포맷터에 설정된 로케일에 따라 달라집니다.

+0

흥미 롭습니다 - 'DateTimeFormatter' 스펙에는 로케일이 나오는 것을 언급하지 않습니다. 그렇다면 ISO-8601을 "주 1 주일 기준"으로 설정하려면 어떻게해야합니까? 이 ISO 형식을 사용하는 자체 로케일 ("en-AU", 'DateTimeFormatter.ofPattern ("YYYY-ww"). withLocale (Locale.getDefault()))을 설정하면 여전히 동일한 결과를 얻습니다. –

+0

사실, 나는'GERMANY'와'FRANCE'를 로케일로 시도해 보았습니다. 그리고 두 경우 모두'2015-53'이 예상됩니다. 월요일의 첫 번째 요일로 월요일 대신 일요일을 사용하면 1 월 3 일이 주일이라고 생각하는 이유를 설명 할 수 있습니다. _2_)는 단지 미국의 일이었습니다. 하지만 고마워, 나는 그걸로 일할 수있어! –