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()
答案 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