You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发问题:MySQL Timestamp存SQLite失败及Gson解析时间报错

解决两个Android开发中的时间处理问题

我来帮你逐个搞定这两个头疼的问题:


问题1:无法将MySQL Timestamp以Long形式存储到Android SQLite

你的转换器类只实现了从Long转Date的逻辑,但Room需要双向类型转换——存入数据库时得把Date转成Long,读取时再转回来。另外注意你实体类里的@TypeConverters注解写的是JConverter.class,应该是笔误,要改成你的转换器类Converters.class。

修正后的转换器类:

public class Converters {
    // 从SQLite读取Long值转成Date
    @TypeConverter
    public static Date fromTimestamp(Long value) {
        return value == null ? null : new Date(value);
    }

    // 将Date转成Long值存入SQLite
    @TypeConverter
    public static Long dateToTimestamp(Date date) {
        return date == null ? null : date.getTime();
    }
}

修正后的User实体类:

@Entity
@TypeConverters({Converters.class}) // 修正转换器类的引用
public class User {
    private Date date_added;

    public Date getDate_added() { return date_added; }
    public void setDate_added(Date date_added) { this.date_added = date_added; }
}

这样Room就能正确把MySQL的Timestamp(转成Date后)转换成Long存储到SQLite里了。


问题2:Gson解析字符串时间戳抛JsonSyntaxException

Gson默认只认ISO 8601格式的日期字符串(比如yyyy-MM-dd'T'HH:mm:ssZ),而你的接口返回的是2018-04-19 21:42:21这种带空格的格式,所以得自定义一个Date类型适配器来处理这种格式。

方法一:全局注册自定义适配器(推荐)

先写一个DateTypeAdapter:

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class DateTypeAdapter extends TypeAdapter<Date> {
    // 匹配接口返回的日期格式
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());

    @Override
    public void write(JsonWriter out, Date value) throws IOException {
        out.value(dateFormat.format(value));
    }

    @Override
    public Date read(JsonReader in) throws IOException {
        try {
            return dateFormat.parse(in.nextString());
        } catch (Exception e) {
            throw new IOException("日期解析失败", e);
        }
    }
}

然后构建Gson实例时注册这个适配器:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Date.class, new DateTypeAdapter())
        .create();

// 现在解析就不会报错了
User[] users = gson.fromJson(response, User[].class);

方法二:在实体类字段上单独指定适配器

如果不想全局生效,可以在User类的date_added字段上加上@JsonAdapter注解:

@Entity
@TypeConverters({Converters.class})
public class User {
    @JsonAdapter(DateTypeAdapter.class) // 指定适配器
    private Date date_added;

    public Date getDate_added() { return date_added; }
    public void setDate_added(Date date_added) { this.date_added = date_added; }
}

这样用默认的gson.fromJson也能正确解析了。


内容的提问来源于stack exchange,提问作者Jayesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:45:00