如何在使用Groovy的JsonBuilder时保留时区?

时间:2014-09-08 18:39:38

标签: json date groovy timezone jsonbuilder

Groovy的JsonBuilder似乎根本没有将日期中的时区转换为JSON字符串。或者更确切地说,它总是使用GMT。例如,以下代码应将日期打印为2001-02-03,GMT +2的午夜。但相反,它打印2001-02-02T22:00:00 + 0000,即同一日期减去2小时,就好像它将在格林威治标准时间一样。

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 个答案:

答案 0 :(得分:2)

查看JsonBuilder,它看起来像 bug 不支持的功能。

致电

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

静态调用JsonOutput.toJson(内容)。 在一些逻辑之后,它调用了JsonOutput.writeObject,它表明我们正在处理日期(如果省略getTime调用,则为日历)。

然后它调用JsonOutput.writeDate,它引用私有静态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 ] ) )

输出{" date":" 2001-02-03T00:00:42 + 0200"}

使用SimpleDateFormat解决线程安全问题,请参阅here