我正在使用SQLLite代码将日期存储为整数(我假设自样式以来的这么多天)。我想把这个int转换为日期但是......
public int getDate(){
...
Date d = new Date(m.getDate());
似乎给了我错误的价值。
有什么想法吗?
更新
问题1。)
如果有人遇到同样的问题,问题是SQLLite Integer不完全是整数。如果我打电话......
item.setDate(rs.getInt("date"));
我得到一个负数,显然这是因为DB中的值大于java int的最大值。一旦我改为......
item.setDate(rs.getLong("date"));
该值与预期一致。尽管将表值创建为INTEGER。
现在我得到了与DB匹配的值“1383769720540277”,但是......
Date d = new Date(m.getDate()*1000L);
给我一个886-10-29的日期,这看起来也不正确
更新2
根据this工具,它必须以毫秒* 1000为单位。我正在研究一种方法来处理这个问题,因为.001是双精度的,不能用于创建长而不舍入。
答案 0 :(得分:1)
一个SQLLite整数最多可以是8个字节(-2 ^ 63到2 ^ 63-1);见http://www.sqlite.org/datatype3.html。
Java整数只有4个字节(-2 ^ 31到2 ^ 31-1);长是8个字节;见http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
现在是UNIX时代以来的1,384,621,644秒;这是1,384,621,644,000毫秒或1,384,621,644,000,000微秒。你肯定需要一个Java来保存它们,因为它们大于4个字节(4,294,967,295)
看起来您的时间戳以微秒为单位。 java.util.Date
构造函数自纪元以来需要毫秒。您可以通过除以1000来计算毫微秒(毫秒);无需转换为字符串并返回:
item.setDate(rs.getLong("date")/1000);
答案 1 :(得分:0)
这里有几个问题......
SQLLite中的Integer类型显然比Java中的Integer类型长。这意味着只是因为它表示Integer并不意味着你应该使用整数。在我的情况下,我需要使用long来获得正确的值。
rs.getLong("日期&#34);
将Date添加为整数的应用程序存储了太多细节。为了使它工作,我不得不放弃最后3个字符。
String s = String.valueOf(rs.getLong(" date"));
s = s.substring(0,s.length() - 3);
item.setDate(的Long.parseLong(S));
一旦完成这两项工作,它似乎正确处理。如果某人有更多关于正在发生的事情的详细/更好的链接,请随时详细说明检查。