2

Groovy 的 JsonBuilder 似乎根本没有将日期中的时区转换为 JSON 字符串。或者更准确地说,它始终使用 GMT。例如,以下代码应将日期打印为 2001 年 2 月 3 日午夜,格林威治标准时间 +2。但相反,它打印 2001-02-02T22:00:00+0000,即与 GMT 相同的日期减去 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()
4

1 回答 1

2

查看 JsonBuilder 它看起来像一个错误不受支持的功能。

打电话时

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

它静态调用 JsonOutput.toJson(content)。经过一些逻辑后,它调用 JsonOutput.writeObject 来确定我们正在处理日期(或者如果您省略 getTime 调用,则为日历)。

然后它调用 JsonOutput.writeDate ,它引用基于 DateFormatThreadLocal() 的私有静态 dateFormatter;

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

注意 SimpleDateFormat 的线程安全问题,请参见此处

于 2014-09-09T08:55:20.607 回答