2014-09-08 2 views
2

Groovy의 JsonBuilder는 날짜의 시간대를 JSON 문자열로 전혀 변환하지 않는 것 같습니다. 또는 더 정확하게는 GMT를 항상 사용합니다. 예를 들어, 다음 코드는 2001-02-03, GMT +2 자정으로 날짜를 인쇄합니다. 대신에 2001-02-02T22 : 00 : 00 + 0000을 인쇄합니다. 즉 GMT 인 것처럼 동일한 날짜에서 2 시간을 뺀 값을 인쇄합니다.Groovy의 JsonBuilder를 사용할 때 시간대를 유지하는 방법은 무엇입니까?

JsonBuilder에 버그가 있습니까? 아니면 API를 사용할 때 고려해야 할 "알려진 기능"입니까?

import groovy.json.JsonBuilder 

def c = new GregorianCalendar(new Locale("fi", "FI")) // GMT+2, no DST by default 
c.set(2001, 1, 3, 0, 0) // 2001-02-03T00:00:xx, xx is current seconds. Not set as irrelevant 


println (new JsonBuilder([ date: c.getTime() ])).toString() 

답변

2

는 JsonBuilder 보면 그것은 버그 또는 지원되지 않는 기능처럼 보인다.

그것은 정적 JsonOutput.toJson (내용)를 호출

(new JsonBuilder([ date: c.getTime() ])).toString() 

를 호출. 일부 논리 후에 JsonOutput.writeObject를 호출하여 날짜를 처리합니다 (getTime 호출을 생략하면 달력).

그런 다음 JsonOutput.writeDate를 호출합니다.이 정적 메서드는 private static dateFormatter를 참조합니다. DateFormatThreadLocal()을 기반으로합니다.

DateFormatThreadLocal은 미국 로케일과 GMT 시간대가있는 SimpleDateFormat을 만듭니다.

나는 빌더에 자신의 날짜 형식을 지정할 수있는 방법을 찾을 수 없습니다, 그래서 당신이-사전 형식의 날짜와 빌더 문자열을 제공 할 것입니다 제안 :

def fiTimeZone = TimeZone.getTimeZone("GMT+2") 
def formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", new Locale("fi", "FI")) 
formatter.setTimeZone(fiTimeZone) 

def c = new GregorianCalendar(new Locale("fi", "FI")) 
c.set(2001, 1, 3, 0, 0) // 2001-02-03T00:00:xx, xx is current seconds. Not set as irrelevant 
def formatedDate = formatter.format(c.getTime()) 
println (new JsonBuilder([ date: formatedDate ])) 

출력 { "날짜" "2001-02-03T00 : 42 + 0200 : 00"SimpleDateFormat에와

마음 스레드 안전 문제는 내 논리가 정확하고 실제로 JsonBuilder 뭔가가 확인을위한 here

+1

감사를 참조}. 사용자 지정 서식 지정 대신 기본 JSON 라이브러리를 변경하기로 결정했습니다. Btw, Jacson도 같은 문제에서 실패하지만, Jacson-jr은 정상적으로 작동합니다. – kaskelotti