2017-01-25 5 views
1

Java 8 이상에 내장 된 java.time 클래스는 MonthDayYearMonth 클래스를 제공합니다. 그들의 toStringparse 메서드는 표준 ISO 8601 형식 (--MM-DD & YYYY-MM)을 사용합니다. 이는 현명한 방법입니다.java.time에서`MonthDay` 또는`YearMonth` 클래스의 문자열을 지역화 하시겠습니까?

사람에게 표시하기 위해 표준 형식이 적합하지 않을 수 있습니다. 자동으로 지역화 된 문자열을 생성하여 MonthDay 또는 YearMonth의 객체에있는 값을 나타낼 수 있습니까?

예를 들어, 미국에서는 사용자가 일반적으로 월별 MM/DD 및 월 - 월별 MM/YY를 원할 수 있습니다. 영국 사용자는 월간 DD/MM을 원할 수 있습니다.

어쨌든 서식 파일 패턴을 명시 적으로 정의하지 않고 Locale까지 이러한 변형을 자동화 할 수 있습니까?


나는 날짜 중심의 현지화 포맷을 사용하여, 다음 코드를 시도했다.

Locale l = Locale.US; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate (FormatStyle.SHORT).withLocale (l); 

YearMonth ym = YearMonth.of (2017 , Month.JANUARY); 
MonthDay md = MonthDay.of (Month.JANUARY , 29); 

String outputYm = ym.format (f); 
String outputMd = md.format (f); 

즉 코드 또는 YearMonthMonthDay 어느 사용될 때 예외를 발생 실패. YearMonth를 들어

:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: DayOfMonth 
    at java.time.YearMonth.getLong(YearMonth.java:494) 
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) 
    at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2540) 
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179) 
    at java.time.format.DateTimeFormatterBuilder$LocalizedPrinterParser.format(DateTimeFormatterBuilder.java:4347) 
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179) 
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746) 
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720) 
    at java.time.YearMonth.format(YearMonth.java:1073) 
    at javatimestuff.App.doIt(App.java:56) 
    at javatimestuff.App.main(App.java:45) 

MonthDay 경우 :

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra 
    at java.time.MonthDay.getLong(MonthDay.java:451) 
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) 
    at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2540) 
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179) 
    at java.time.format.DateTimeFormatterBuilder$LocalizedPrinterParser.format(DateTimeFormatterBuilder.java:4347) 
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179) 
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746) 
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720) 
    at java.time.MonthDay.format(MonthDay.java:646) 
    at javatimestuff.App.doIt(App.java:57) 
    at javatimestuff.App.main(App.java:45) 
+0

아마도 'MonthDay.format (DateTimeFormatter)'과 관련된 내용을 찾고 계신 것 같습니까? –

+0

@LouisWasserman'MonthDay'와'YearMonth'의'format()'메소드에서'DateTimeFormatter.ofLocalizedDate'가 실패했다는 것을 보여주는 코드를 추가했습니다. 유사 콘텐츠가있는 경우 게시하십시오. Answer가 [DateTimeFormatterBuilder'] (https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatterBuilder.html)에 있을지 궁금하지만, 어떻게해야할지 모르겠습니다. –

답변

2

JDK-8168532를 참조하십시오. 이 작업을 쉽게하기 위해서는 JDK가 향상되어야합니다.

JDK 외부에서 작업하는 것이 가능하지만 많은 작업이 필요합니다. CLDR XML 파일 (상호 링크되어 있고 많은 참조가있는)을 구문 분석해야합니다. 그런 다음 MonthYearYearMonth에 해당하는 현지화 된 패턴을 추출한 다음 해당 패턴을 사용하여 DateTimeFormatter을 만들 수 있습니다.

또는 비즈니스 요구 사항에 따라 Map<Locale, DateTimeFormatter>지도를 하드 코딩 할 수 있습니다.

+0

JDK-8168532가 Java 10에서 수정 될 확률은 얼마나 될까요? – mkurz

관련 문제