我有一个Android项目正在使用WS提供的对象,该对象包含一个像这样的时间戳的属性:
{
"id": "106471",
"start": "1371736194",
"restart": "0",
"end": "1371736194",
"elapsed": "0",
}
“开始”,“重启”& “end”是UTC中的所有时间戳。我希望ORMLite在保存到数据库时自动将它们转换为java.util.Date
类型。我做的是这个:
@DatabaseTable(tableName = "answers", daoClass=AnswerDao.class)
public class Answer extends Entity<Answer> {
private static final long serialVersionUID = -7486241451710750676L;
@DatabaseField(id = true)
@JsonProperty("id")
private Integer _id;
public static String ID = "_id";
@DatabaseField
@JsonProperty("end")
private Date timestamp;
...
}
但是,在数据库中,时间戳始终为:1970-01-16 21:02:16.000194
。我猜这是时代。
这是完全可能还是我需要将对象保存为整数并在每次访问时将其转换?
答案 0 :(得分:2)
但是,在数据库中,时间戳始终为:1970-01-16 21:02:16.000194。我猜这是时代。
正如@blackbelt指出的那样,1371736194是以秒为单位的时间而不是毫秒。我假设你正在做类似的事情:
Answer answer = new Answer();
// the time field comes from a json variable
json.start = 1371736194;
answer.setTimestamp(new Date(json.start));
在将该数字添加到日期之前,您需要将该数字乘以1000。 start
应该很长。
json.start *= 1000;
answer.setTimestamp(new Date(json.start));
如果你的乘数是1000,那么你应该得到Thu Jun 20 09:49:54 2013 EDT
的有效日期/时间。
如果您需要自动执行此操作,则可以创建自己的自定义数据类型:
但是,我认为您希望在保留ORMLite之前使日期字段有效。
这是完全可能还是我需要将对象保存为整数并在每次访问时将其转换?
您可以将其保存为数据库中的DATE_LONG
,效率更高,但您仍需要执行* 1000
。 DATE_LONG
只将日期存储为长时间毫秒。
@DatabaseField(dataType = DataType.DATE_LONG)
private Date timestamp;
顺便说一下,那个值是自纪元以来的秒数,而不是时间戳。此外,对于nitpick,SQL中有一个时间戳数据库实体类型,因此您可以考虑将字段名称更改为date
。