2

Groovy の JsonBuilder は、日付のタイムゾーンを JSON 文字列にまったく変換していないようです。より正確には、常に GMT を使用します。たとえば、次のコードは日付を 2001 年 2 月 3 日の午前 0 時、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()
4

1 に答える 1

2

JsonBuilder を見ると、バグまたはサポートされていない機能のように見えます。

通話時

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

JsonOutput.toJson(content) を静的に呼び出します。いくつかのロジックの後、JsonOutput.writeObject を呼び出して、日付 ​​(または getTime 呼び出しを省略した場合はカレンダー) を処理していることを認識します。

次に、DateFormatThreadLocal(); に基づくプライベートな静的 dateFormatter を参照する JsonOutput.writeDate を呼び出します。

DateFormatThreadLocal は、US ロケールと 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 に答える