Stack Overflow の以下 Q&A にある Java 版の答えをもとに、現時点で推奨の TypeAdapter を利用して Kotlin に翻訳した記事です。
class GsonUtcDateAdapter: TypeAdapter<Date?>() {
private val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
init {
format.timeZone = TimeZone.getTimeZone("UTC")
}
override fun write(out: JsonWriter?, value: Date?) {
val writer = out!!
if (value == null) {
writer.nullValue()
} else {
writer.value(format.format(value))
}
}
override fun read(`in`: JsonReader?): Date? {
val reader = `in`!!
if (reader.peek() == JsonToken.NULL) {
reader.nextNull()
return null
} else {
try {
return format.parse(reader.nextString())
} catch (e: java.text.ParseException) {
throw JsonParseException(e)
}
}
}
}
...
val gson = GsonBuilder().registerTypeAdapter(Date::class.java, GsonUtcDateAdapter()).create()
val date = gson.fromJson("\"2018-10-01T09:48:37.546Z\"", Date::class.java) // deserialize
val json = gson.toJson(date) // serialize
素の Gson は Date オブジェクトをシリアライズ・デシリアライズするとき、ローカルタイムゾーンを強制すると先の Stack Overflow 記事に書かれています。自分でアダプターを書いて仕込む必要があるのですね。
The gson default serializer always defaults to your local timezone, and doesn't allow you to specify the timezone. See the following link.....