【问题标题】:In gson/retrofit, is there a built-in way to handle dates of varying formats?在 gson/retrofit 中,是否有内置方法来处理不同格式的日期?
【发布时间】:2014-12-16 19:22:54
【问题描述】:

我目前使用的 api 以“yyyy-MM-dd”的形式和典型的 ISO8601 格式“2012-06-”返回日期(为了这个问题,日期和日期时间是相同的) 08T12:27:29.000-04:00"

您如何“干净地”设置 GSON 来处理这个问题?或者我最好的方法是将日期视为字符串并在我的模型对象中使用一些自定义 getter 以所需的特定形式输出?

我目前正在执行以下操作,但每当我看到“yyyy-MM-dd”字段时解析都会失败。

return new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
    .create();

我最终会在 Android + Retrofit 环境中使用它,以防有可用的解决方案。


编辑:根据下面的建议,我创建了一个自定义 TypeAdapter。我的完整解决方案可以在这里看到(作为要点):https://gist.github.com/loeschg/2967da6c2029ca215258

【问题讨论】:

  • 你可能需要为 Date 注册一个自定义的 TypeAdapter,它将尝试各种格式。

标签: java android date gson retrofit


【解决方案1】:

我会这样做:(但未经测试):

SimpleDateFormat[] formats = new SimpleDateFormat[] {
    new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"),
    // Others formats go here
};

// ...

return new GsonBuilder()
    .registerTypeAdapter(Date.class, new TypeAdapter<Date>() {

        @Override
        public Date read(JsonReader reader) throws IOException {
            if (reader.peek() == JsonToken.NULL) {
                reader.nextNull();
                return null;
            }
            String dateAsString = reader.nextString();
            for (SimpleDateFormat format : formats) {
                try {
                    return format.parse(dateAsString);
                } catch (ParseException e) {}  // Ignore that, try next format
            }
            // No matching format found!
            return null;
        }
    })
    .create();

一个尝试多种格式的自定义类型适配器。

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2012-06-27
    • 2011-10-05
    相关资源
    最近更新 更多