我试图对使用rest的java-ee应用程序进行一些测试,但是当我尝试使用gson格式化一些json时,我收到了以下错误:
java.text.ParseException: Failed to parse date ["1489752692000']: Invalid time zone indicator '9'
当我用Gson gson = new Gson();
初始化我的Gson时发生了这种情况,我在StackOverflow上找到了this question,其中解决方案是创建一个自定义的DateDeseriliazer类并且像这样初始化:
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new GsonDateFormatter()).create();
这是我的DateDeserializer类的版本:
public class GsonDateFormatter implements JsonDeserializer<Date> {
private final DateFormat dateFormat;
public GsonDateFormatter() {
dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
dateFormat.setTimeZone(TimeZone.getTimeZone("CET"));
}
public synchronized Date deserialize(JsonElement jsonElement,Type type,JsonDeserializationContext jsonDeserializationContext) {
try {
return dateFormat.parse(jsonElement.getAsString());
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
}
但这只会将错误消息更改为:
java.text.ParseException: Unparseable date: "1489752692000"
所以我现在不太确定如何解决这个问题,我希望有人可以帮助我。
提前致谢。
答案 0 :(得分:2)
你有自纪元以来似乎毫秒的东西。
建议使用java.time
API now in Java 8代替SimpleDateFormat
import java.time.Instant;
import java.time.ZonedDateTime;
import java.timeZoneOffset;
// ...
long epoch = Long.parseLong(jsonElement.getAsString()); // Or if you can do jsonElement.getAsLong()
Instant instant = Instant.ofEpochMilli(epoch);
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); // 2017-03-17T12:11:32Z
但是,无论如何,您不需要SimpleDateFormat
从长值返回Date
。
public synchronized Date deserialize(JsonElement jsonElement,Type type,JsonDeserializationContext jsonDeserializationContext) {
long epoch = jsonElement.getAsLong();
return new Date(epoch);
}