2016-06-16 4 views
0

ZonedDateTime.now (ZoneOffset.UTC) .toString()을 사용하여 현재 시간을 가져 오려고합니다. 잘 작동하지만 롤오버 (00.000Z)에있을 때 초/밀리 초가 잘리는 것처럼 보입니다. 일반적으로 중요하지 않지만 ElasticSearch에 데이터를 쓰고 있습니다. ElasticSearch는 전달하는 날짜 (수집 된 시간)에 대한 엄격한 매핑이 있습니다.Java 8 ZonedDateTime

내가 생각하고있는 것이 어쩌면 당황 할 수도 있지만, 항상 초와 밀리 초로 날짜/시간을 제공 할 수 있는지 확인하려고합니다.

기본 코드 (첫 번째 패스는 밀리 초를 추가했지만, 초도 가능 생략 할 수 표시) :

def utcDate = ZonedDateTime.now(ZoneOffset.UTC) 
def utcDateStr = utcDate.toString() 
utcDateStr = utcDateStr.contains(".") ? utcDateStr 
     : utcDateStr.replace("Z","").concat(".000Z") 

그것은 거의 항상 아래의 형식으로 할 것을 권장합니다

2016-06-16T05:43:07.624Z 
+0

'toString() '을 호출하면 초/밀리 초를 줄인다는 것이 확실 할 것입니다. 그렇지 않으면'now()'와 같이 들리므로 소리가 끊깁니다. –

+0

아, 좋은 지적 @ 존스 켓. 당신이 맞습니다, 나는 질문을 수정/수정 할 것입니다. – scarpacci

답변

4

먼저 그림에서 표준 시간대 부분을 완전히 차지하는 ZonedDateTime 대신 실제로 Instant이 필요합니다. 그러나 어느 쪽이든, DateTimeFormatter을 사용하여 원하는 값의 형식을 지정하면됩니다.

그것은 당신이 뭔가를 원하는 같은 소리 (자바, 적절하게 그루비로 조정)

DateTimeFormatter formatter = DateTimeFormatter 
    .ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US) 
    .withZone(ZoneOffset.UTC); 
Instant now = Instant.now(); 
String text = formatter.format(now); 
System.out.println(text); 

그 것이다 당신이 정말 원하는 경우 (0

경우에도 여전히 출력 밀리 초 값 ZonedDateTime을 사용하면 동일한 포맷터로 작업 할 수 있습니다. 그러나 개념적으로 생각하면 표현하려고하는 순간이 바로 그 순간입니다.

+0

더 일반적인'yyyy'에'uuuu'를 선택한 특별한 이유가 있습니까? – shmosel

+0

@shmosel : 처음에는'yyyy'가 작동하지 않았기 때문에. 'uuuu '도 시간대를 설정하지 않기 때문에 나도하지 않았지만 어쨌든'yyyy'는 1905 년과 1905 년 사이에 "1905"가 실제로 모호하다는 것을 의미합니다. 문제는 아니지만 단지 "올해"는 IMO를 약간 깔끔하게 만듭니다. –

0

원한다면 포맷터 경로, 당신 그래서 같은 하나를 구축 할 수 있습니다 :

DateTimeFormatter ES_ISO8601_FORMATTER = new DateTimeFormatterBuilder() 
      .parseCaseInsensitive() 
      .append(
        new DateTimeFormatterBuilder() 
          .parseCaseInsensitive() 
          .append(ISO_LOCAL_DATE) 
          .appendLiteral('T') 
          .append(
            new DateTimeFormatterBuilder() 
              .appendValue(HOUR_OF_DAY, 2) 
              .appendLiteral(':') 
              .appendValue(MINUTE_OF_HOUR, 2) 
              .appendLiteral(':') 
              .appendValue(SECOND_OF_MINUTE, 2) 
              .appendFraction(NANO_OF_SECOND, 3, 9, true) 
              .toFormatter() 
          ) 
          .toFormatter() 
      ) 
      .appendOffsetId() 
      .toFormatter(); 

을, 변화는 기본적으로

3의 최소 폭

         .appendFraction(NANO_OF_SECOND, 3, 9, true) 
을주고있다

(즉 자바 (8)의 DateTimeFormatter 클래스의 코드에서 함께 자갈길 것) 원래의 ISO 포맷터에서 0 대신에