Как сохранить часовые пояса при использовании 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 смотрите здесь

Другие вопросы по тегам