我正在为Android操作系统编写应用程序,我需要在SQLite数据库中存储一些时间值。我一直在使用android.text.format.Time在应用程序中存储时间值,然后将值作为millis插入到DB中作为REAL值。在SDK模拟器上,一切都很完美。在唯一的手机上,我有机会测试我的应用程序(到目前为止),我的持续时间代码无法按预期工作。一些相关的代码:
private static final String DATABASE_CREATE =
"create table " + DATABASE_TABLE + " ("
+ KEY_ROWID + " integer primary key autoincrement, "
+ KEY_START + " REAL, "
+ KEY_STOP + " REAL, "
+ KEY_DUR + " REAL );";
...
private SQLiteDatabase mDb;
ContentValues timerValues = new ContentValues();
...
timerValues.put(KEY_START, stime.toMillis(false));
timerValues.put(KEY_STOP, etime.toMillis(false));
timerValues.put(KEY_DURATION, stime.toMillis(false)-etime.toMillis(false));
int result = mDb.insert(DATABASE_TABLE, null, timerValues);
我从具有略微不同代码的两个单独函数中提取这些数据,两者都使用Time.set(long millis),两者都给出了不正确的结果:start和stop值恢复正确,但持续时间也是17小时大。我是否遗漏了关于计算持续时间的事情,或者这看起来就像这个特定的机器人有什么“特殊”的东西?星期一我将有另一个机器人进行测试,但任何想法都会受到赞赏。
答案 0 :(得分:1)
除了Currie先生关于专栏名称的说明之外,还有一个问题就是为什么你首先要浪费空间存储KEY_DURATION
。它可以从KEY_START
和KEY_STOP
计算:
SELECT start, stop, dur=stop-start FROM whatever
此外,android.text.format.Time
只有第二个精度,所以如果你需要毫秒,你就不应该使用那个类。
如果这些都没有帮助或认为合适,请尝试记录您在KEY_DURATION
中输入的值,以查看问题是在您的计算中还是存储方式。
答案 1 :(得分:0)
问题实际上是由手机上的时区设置引起的。似乎Time.toMillis会将时间从UTC时代的毫秒输出。使用Time.set(long millis)设置时间时,Time假定millis是从Epoch,UTC开始的毫秒数。然后,当您请求Time.format(“%T”)时,Time返回调整为本地TZ的HH:MM:SS字符串。除非您使用Time来测量持续时间,否则这是有道理的,在这种情况下,可能应该使用一些努力来考虑TZ调整。因此,我所期望的是,经过20分钟的时间,在时代前一天的17:20:00(MST或GMT-7)被时间代表。很好的小无证行为。
在我的应用程序中,我选择编写一个简单的实用程序类来处理转换为毫秒到适当的字符串。希望这篇文章能够让别人有些头疼,因为我的谷歌没有透露任何相关信息。