使用@CsvDate格式化SQL Timestamp写入CSV时上午时间格式异常求助
问题解决:SQL Timestamp写入CSV格式异常
问题原因
你遇到的格式不一致问题,核心是24小时制HH与12小时制标识a的混用冲突。OpenCSV的@CsvDate注解在解析这种混合格式时,上午时段(12点前)会触发内部的格式兼容逻辑,导致格式 fallback 为系统默认的短日期格式。
解决方案
1. 统一时间制格式
根据需求选择一种时间制,避免混合使用:
- 若使用24小时制(无需AM/PM标识):
@CsvDate("yyyy-MM-dd HH:mm:ss") private Timestamp inDate; - 若使用12小时制(保留AM/PM):将
HH改为hh(12小时制小时字段):@CsvDate("yyyy-MM-dd hh:mm:ss a") private Timestamp inDate;
2. 强制指定Locale
系统默认Locale可能干扰日期格式化,在CSV写入配置中固定Locale:
StatefulBeanToCsvBuilder<T> builder = new StatefulBeanToCsvBuilder<>(writer) .withSeparator(CSVWriter.DEFAULT_SEPARATOR) .withLocale(Locale.US) .build();
3. 自定义转换器兜底
如果上述方法无效,用自定义转换器完全控制格式化逻辑:
public class CustomTimestampConverter extends AbstractBeanField<Timestamp> { @Override protected String convert(Timestamp value) { if (value == null) { return ""; } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a", Locale.US); return sdf.format(new Date(value.getTime())); } }
然后在字段上替换注解:
@CsvCustomBindByName(converter = CustomTimestampConverter.class) private Timestamp inDate;
内容的提问来源于stack exchange,提问作者KVK
相关产品推荐
相关产品推荐

