2014-09-08 1 views
2

JovBuilder от Groovy, похоже, не превращает временные интервалы в датах в строку JSON вообще. Точнее, он всегда использует GMT. Например, следующий код должен печатать дату как полночь 2001-02-03, GMT +2. Но вместо этого он печатает 2001-02-02T22: 00: 00 + 0000, то есть в ту же дату минус 2 часа, как если бы он находился в GMT.Как сохранить часовые пояса при использовании Groovy's 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 это выглядит как ошибка или неподдерживаемый функциональности.

При вызове

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

Он вызывает статически JsonOutput.toJson (содержание). После некоторой логики он вызывает JsonOutput.writeObject, который вычисляет, что мы имеем дело с датой (или календарем, если вы опускаете вызов getTime).

Затем он вызывает JsonOutput.writeDate, который ссылается на приватную статическую датуFormatter На основе DateFormatThreadLocal();

DateFormatThreadLocal создает SimpleDateFormat с локалией США и часовым поясом GMT.

я не мог найти способ, чтобы указать свой собственный формат даты для строителя, поэтому я предлагаю вам предварительно формат даты и предоставить их в виде строки в строитель:

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: 00: 42 + 0200»}

Интеллектуальных вопросы безопасности потока с SimpleDateFormat см here

+1

Спасибо за подтверждение того, что моя логика правильна и есть на самом деле есть что-то с JsonBuilder. Вместо пользовательского форматирования я решил изменить базовый JSON lib, спасибо за идею. Btw, 'Jacson' терпит неудачу по той же проблеме, но' Jacson-jr' отлично работает. – kaskelotti

 Смежные вопросы

  • Нет связанных вопросов^_^