使用Groovy的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()

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

呼叫时

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

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

然后它调用 JsonOutput.writeDate,它指的是一个私有的静态日期格式化程序基于 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 ] ) )

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

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

相关内容

  • 没有找到相关文章

最新更新