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

SQLite数据库LocalDate格式返回异常问题求助

解决SQLite中LocalDate返回时间戳而非日期字符串的问题

问题根源在于SQLite没有原生的DATE数据类型,默认会将日期类字段存储为数值型时间戳;而H2数据库对日期类型的处理更贴近标准SQL,因此出现差异。以下是几种可行的解决方法:

方法一:指定实体类字段的存储类型为TEXT

修改Log实体类的dateLogged字段,通过columnDefinition强制SQLite以文本格式存储日期字符串:

@Column(nullable = false, columnDefinition = "TEXT")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private LocalDate dateLogged;

这样SQLite会直接存储yyyy-MM-dd格式的字符串,读取时JPA能正确映射为LocalDate,返回前端时@JsonFormat也能正常序列化为指定格式的字符串。

方法二:配置SQLite JDBC驱动的日期处理参数

在数据库连接URL中添加date_string_format参数,让JDBC驱动以指定格式返回日期字段:

# application.properties
spring.datasource.url=jdbc:sqlite:your-database-name.db?date_string_format=yyyy-MM-dd

这个参数会让SQLite驱动将日期类型的数值自动转换为指定格式的字符串,无需修改实体类代码。

方法三:全局配置Jackson的LocalDate序列化规则

如果上述方法无效,可能是全局序列化配置覆盖了字段上的@JsonFormat,可以添加Jackson配置类统一处理LocalDate的序列化:

@Configuration
public class JacksonDateConfig {
    @Bean
    public ObjectMapper customObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule timeModule = new JavaTimeModule();
        // 序列化LocalDate为yyyy-MM-dd格式字符串
        timeModule.addSerializer(LocalDate.class, 
            new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        // 反序列化字符串为LocalDate
        timeModule.addDeserializer(LocalDate.class, 
            new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        objectMapper.registerModule(timeModule);
        return objectMapper;
    }
}

注意:如果使用方法一,需要重新生成数据库表(或手动修改现有表的字段类型),否则原有的时间戳数据可能无法正常转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:07:40