2017-12-05 6 views
0

유효한 XSD datetime 값은 다음과 같습니다

2002-05-30T09:00:00 
2002-05-30T09:30:10.5 
2002-05-30T09:30:10Z 
2002-05-30T09:30:10-06:00 

때문에 실패 할 경우 처음 두 값의 ZonedDateTime

public static void main(String[] args) { 
    System.out.println(ZonedDateTime.parse(value, DateTimeFormatter.ISO_DATE_TIME).withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime()); 
} 

으로이 값을 구문 분석했을 때

Exception in thread "main" java.time.format.DateTimeParseException: Text '2017-12-05T10:05:19.296' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 2017-12-05T10:05:19.296 of type java.time.format.Parsed 

것은 내가를 사용합니다 : 어떤 시간대가 없다그냥 마지막 두 값에서 시간대를 무시합니다.

public static void main(String[] args) { 
    System.out.println(LocalDateTime.parse("2002-05-30T09:30:10-06:00", DateTimeFormatter.ISO_DATE_TIME)); // print 2002-05-30T09:30:10 and I am in +1 timezone 
} 

그래서이 xsd datetime을 변환하는 올바른 방법은 무엇입니까?

UPDATE

는 어쩌면 가장 좋은 방법은 XSD를 변환 : datime도 zoneDateTime를 지원 GregorianCalendar를하는 옛날 방식을 사용하는 것입니다?

public static LocalDateTime parseDateTime(String strVal) { 
    try { 
     if (strVal == null || strVal.isEmpty()) 
      return null; 
     return ((GregorianCalendar) (DatatypeConverter.parseDateTime(strVal))).toZonedDateTime() 
       .withZoneSameLocal(ZoneId.systemDefault()).toLocalDateTime(); 
    } catch (Exception e) { 
     throw new IllegalArgumentException(e); 
    } 
} 

답변

0

문제는 ZonedDateTime에는 항상 시간대가 있어야한다는 것입니다. 처음 두 날짜가 누락되었습니다. 내가 제안하는 것은 별도의 클래스에 로직을 캡슐화하고, 존이 빠진 경우 UTC 날짜 시간으로 가정하기 때문에 마지막에 'Z'를 추가하는 것입니다. 메서드는 항상 ZonedDateTime을 반환하며 코드 클라이언트는 생성 방법에 대해 알지 못합니다.