Android Java中Retrofit2提交日期时转字符串异常问题
问题分析与解决
核心原因
提交后created_time显示为java.text.SimpleDateFormat@4f76f1a0,本质是序列化了SimpleDateFormat对象而非格式化后的日期字符串,大概率是以下两种情况之一:
MeasureDataClass的created_time字段被定义为SimpleDateFormat类型,而非String。Gson序列化时会调用该对象的默认toString()方法,输出内存标识字符串。- 某个环节误将
SimpleDateFormat对象(代码中的date变量)传入postData方法,而非格式化后的createdTime字符串。
快速修复步骤
步骤1:检查MeasureDataClass定义
确保created_time字段为String类型,构造函数、getter/setter也对应String类型。示例正确定义:
public class MeasureDataClass { private String user_idx; private String device_id; // ...其他字段 private String created_time; public MeasureDataClass(String user_idx, String device_id, /* ...其他参数 */ String created_time) { this.user_idx = user_idx; this.device_id = device_id; // ...其他字段赋值 this.created_time = created_time; } public String getCreated_time() { return created_time; } public void setCreated_time(String created_time) { this.created_time = created_time; } }
步骤2:确认参数传递正确性
检查postData调用的最后一个参数,确保传入的是格式化后的createdTime字符串,而非SimpleDateFormat对象。可以简化冗余的toString()调用(createdTime本身已是String):
// 原代码 postData(useridx, deviceid, correlation, tempvalue, intensity, shutterspeed, createdTime.toString()); // 简化后 postData(useridx, deviceid, correlation, tempvalue, intensity, shutterspeed, createdTime);
更规范的优化方案(推荐)
避免手动格式化日期,让Gson自动处理Date类型序列化,减少出错概率:
- 修改
MeasureDataClass,将created_time改为Date类型并添加格式化注解:
import com.google.gson.annotations.JsonFormat; import java.util.Date; public class MeasureDataClass { // ...其他字段 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date created_time; public MeasureDataClass(/* ...其他参数 */ Date created_time) { // ...其他字段赋值 this.created_time = created_time; } public Date getCreated_time() { return created_time; } public void setCreated_time(Date created_time) { this.created_time = created_time; } }
- 简化调用代码,直接传入
Date对象:
Date dt = new Date(); // 无需手动格式化,直接传入Date对象 postData(useridx, deviceid, correlation, tempvalue, intensity, shutterspeed, dt);
Gson会自动按照@JsonFormat指定的格式将Date序列化为目标字符串,避免手动转换的潜在错误。
内容的提问来源于stack exchange,提问作者Jaeseo Lee
相关产品推荐
相关产品推荐

