2017-10-18 9 views
-2

날짜를 인쇄하고 구문 분석하려면 DateTimeFormatter.ISO_LOCAL_DATE을 사용하고 싶습니다.DateTimeFormatter.ISO_LOCAL_DATE를 사용하여 날짜를 인쇄하는 방법은 무엇입니까?

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: Year 
    at java.time.Instant.getLong(Instant.java:603) 
    at java.time.format.DateTimePrintContext$1.getLong(DateTimePrintContext.java:205) 
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) 
    at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2543) 
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182) 
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1744) 
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1718) 
+1

이 내 나쁜, 대신'ZoneId.of ("UTC")'의 – Jerry06

+0

나를 위해 일한 내장 상수 'ZoneOffset.UTC'. [javadoc] (https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#of-java.lang.String-)에 따르면, 그것들은 다음과 같습니다. * "If 영역 ID가 'GMT', 'UTC'또는 'UT'이면 결과는 ZoneOffset.UTC와 동일한 ID 및 규칙을 가진 ZoneI입니다. "* – MadProgrammer

+0

여기 잘 작동 – yegor256

답변

0

이 작동 방법은 다음과 같습니다 :이 Instant 때문에 발생

String text = DateTimeFormatter.ISO_LOCAL_DATE 
    .withZone(ZoneId.of("UTC")) 
    .format(date.toInstant()); 
+2

을 구문 분석하지, 인쇄 된 질문 업데이트, 당신은 또한 사용할 수있는 자바 1.8 –

1

Date date; 
String text = DateTimeFormatter.ISO_LOCAL_DATE.format(
    date.toInstant() 
); 

이것은 내가 갖는 것입니다 : 이것은 내가 인쇄를 위해 뭘하는지입니다 클래스는 타임 라인의 한 지점을 나타냅니다 : 시간대 개념이없는 Unix 에포크 이후의 나노초 수 (1970-01-01T00:00Z) - 특정 날짜/시간 (일/월/년, 시간/분)이 없습니다. utes/초). 다른 시간대의 다른 날짜와 시간을 나타낼 수 있습니다. 포맷터, like you did 특정 존 설정

는 포맷하는 것을 가능하게하는 영역 (그래서 에포크는 특정 날짜 및 시간으로 변환 될 수 있기 때문에 나노초 카운트)에 Instant 변환한다. 이 특정한 경우에 대한

, 당신은 ISO8601 format 만 날짜 부분 (일, 월, 년)를 원하므로 하나 개의 대안은 LocalDateInstant을 변환하고 toString() 메소드를 호출하는 것입니다. 당신이 포맷터에서 UTC를 같이, 나는 그것을 변환하기 위해 동일한을 사용하고 있습니다 :

String text = date.toInstant() 
    // convert to UTC 
    .atZone(ZoneOffset.UTC) 
    // get the date part 
    .toLocalDate() 
    // toString() returns the date in ISO8601 format 
    .toString(); 

your formatter 같은 일을 반환합니다. 물론 다른 형식의 경우 포맷터를 사용해야하지만 특히 ISO8601의 경우 toString() 메서드를 사용할 수 있습니다.


또한 (UTC로,이 경우에) 당신이 원하는 시간대에 Instant을 변환하고 포맷터에 직접 전달할 수 :

String text = DateTimeFormatter.ISO_LOCAL_DATE.format(
    date.toInstant().atZone(ZoneOffset.UTC) 
); 

유일한 차이점은 설정할 때이다 포맷터의 영역은 포맷 할 때 날짜가 해당 영역으로 변환됩니다 (설정하지 않으면 날짜가 변환되지 않습니다).