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에서
는, 나는 (Y
가 week-based-year
하고 w
이 week-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();
흥미 롭습니다 - 'DateTimeFormatter' 스펙에는 로케일이 나오는 것을 언급하지 않습니다. 그렇다면 ISO-8601을 "주 1 주일 기준"으로 설정하려면 어떻게해야합니까? 이 ISO 형식을 사용하는 자체 로케일 ("en-AU", 'DateTimeFormatter.ofPattern ("YYYY-ww"). withLocale (Locale.getDefault()))을 설정하면 여전히 동일한 결과를 얻습니다. –
사실, 나는'GERMANY'와'FRANCE'를 로케일로 시도해 보았습니다. 그리고 두 경우 모두'2015-53'이 예상됩니다. 월요일의 첫 번째 요일로 월요일 대신 일요일을 사용하면 1 월 3 일이 주일이라고 생각하는 이유를 설명 할 수 있습니다. _2_)는 단지 미국의 일이었습니다. 하지만 고마워, 나는 그걸로 일할 수있어! –