Как сохранить часовые пояса при использовании Groovy's JsonBuilder?
JsonBuilder от Groovy, похоже, вообще не преобразует часовые пояса в датах в строку JSON. Точнее, он всегда использует GMT. Например, следующий код должен печатать дату как полночь 2001-02-03, GMT +2. Но вместо этого он печатает 2001-02-02T22:00:00+0000, то есть ту же дату минус 2 часа, как если бы она была в GMT.
Есть ли ошибка в 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()
1 ответ
Глядя на JsonBuilder, он выглядит как ошибка или неподдерживаемая функциональность.
При звонке
( new JsonBuilder( [ date: c.getTime() ] ) ).toString()
Статически он вызывает JsonOutput.toJson(content). После некоторой логики он вызывает JsonOutput.writeObject, который выясняет, что мы имеем дело с датой (или календарем, если вы опускаете вызов getTime).
Затем он вызывает JsonOutput.writeDate, который ссылается на частный статический dateFormatter, основанный на 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 ] ) )
output {"date": "2001-02-03T00: 00: 42 + 0200"}
Проблемы безопасности Mind Thread с SimpleDateFormat смотрите здесь