Gson java.lang.IllegalArgumentException:没有时区指示器

Kim*_*i95 4 java timezone android gson datetime-parsing

我在使用 Gson 时遇到了奇怪的错误。

我是这样创建的

mGson = new GsonBuilder().registerTypeAdapter(beelineItemType, new ItemsDeserializer()).setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();
Run Code Online (Sandbox Code Playgroud)

我的 json 对象是这样的:

"EpgStartDate" : "2018-08-16T18:00:00" 
Run Code Online (Sandbox Code Playgroud)

但是当我尝试反序列化它时,我收到此错误:

ccom.google.gson.JsonSyntaxException: 2018-08-16T06:00:00

caused by: java.text.ParseException: Failed to parse date ["2018-08-16T06:00:00']: No time zone indicator (at offset 0)

Caused by: java.lang.IllegalArgumentException: No time zone indicator
Run Code Online (Sandbox Code Playgroud)

我不明白在哪里放置时区以及如何放置。我在塞尔维亚,所以应该在哪里、如何以及什么时区。如果有人可以提供帮助那就太好了:D

Ani*_*bla 5

你应该像这样制作反序列化器

public class DateDeserializer implements JsonDeserializer<Date> {

  @Override
  public Date deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
      String date = element.getAsString();

      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
      format.setTimeZone(TimeZone.getTimeZone("GMT"));

      try {
          return format.parse(date);
      } catch (ParseException exp) {
          System.err.println(exp.getMessage());
          return null;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

然后注册上面的解串器:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class, new DateDeserializer());
Run Code Online (Sandbox Code Playgroud)

  • 请不要教年轻人使用早已过时且非常麻烦的“SimpleDateFormat”类。至少不是第一个选择。而且并非毫无保留。今天,我们在 [`java.time`,现代 Java 日期和时间 API](https://docs.oracle.com/javase/tutorial/datetime/) 及其 `DateTimeFormatter` 方面有了更好的表现。是的,您可以在 Android 上使用它。对于旧版 Android,请参阅[如何在 Android 项目中使用 ThreeTenABP](/sf/ask/2724592811/)。 (3认同)